删除列包含特定文本的行



我想删除列包含?的所有数据行,例如在列状态的大约 100 行中,我得到的值为 Unknown?Error?InProgressDone

所以,我想删除所有包含?的行

以下是我正在使用的代码

//I am splitting the string on the basis of delimeter  ,
 var data = from val in UserData
                       select val.Split(',');
//Below code is not working
var filterdata = from rows in data
                        where rows.Contains("?")
                        select rows;

你忘了反转包含:

string[] someStringArray = new string[]
{
    ""ABC" ,"Error?","OK"",
    ""DEF","Inprogress","FINE"",
    "1,2,3",
    "?,2,3",
    "1,?,3",
    "4,5,6"
};
//I am splitting the string on the basis of delimeter  ,
var data = from val in someStringArray
            select val.Split(',');
//Below code is not working
var filterdata = from rows in data
                    where !rows.Contains("?") // "!" to select the rows WITHOUT "?"
                    select rows;
foreach (var item in filterdata)
{
    foreach (var i in item)
    {
        Console.Write(i + ",");
    }
    Console.WriteLine();
}
return;

结果:

"DEF","Inprogress","FINE",
4,5,6,

我认为这段代码完美地工作。

除此之外,我做了一个疯狂的猜测:你不是在搜索问题标记"?"。"?"是一个字符,如果字符无法以预期的编码显示,则通常会显示该字符。

看看你的字符有多少:

var chars = someStringArray.SelectMany(s => s.Select(c => c));
foreach (var item in chars.GroupBy(g => g.ToString() + " (" + ((int)g) + ")"))
{
    Console.WriteLine(item.Key + ": " + item.Count());
}

真正的问号有63。如果没有,您会遇到编码问题。

你写道:

我想删除列包含"?">

永远不能使用 LINQ 函数更改输入序列。因此,不能使用 LINQ 从原始数据中删除行。

您可以做的是使用您的数据创建一个不包含问号的新序列。如果需要,您可以将原始数据替换为新序列。

查看您的代码,似乎UserData是一个字符串序列,您希望这些字符串包含逗号分隔的值。

您希望将这些 CSV 字符串拆分为它们的列,但不希望任何列包含"?">

"A,?,B,C"      => do not use this one, one of the column values equals "?"
"A,B,C"        => use this one, none of the column values equal "?"
"A, Hello?, B" => use this one, although the second column contains a question mark
                  this second column is not equal to question mark

这是按如下方式完成的:

static readonly char[] separatorChars = new char[] {','}
const string questionMark = "?";
static readonly IEqualityComparer<string> comparer = 
var rowsWithoutQuestionMarkValues = userData
    // Split each line into column values, using comma as separator
    .Select(line => line.Split(separatorChar)
    // do not use the line if any of the columns equals the question mark
    .Where(splitLine => !splitLine.Any(column => column == questionMark));

如果代码在问号可能看起来不同的区域性中运行,例如:"分号",请考虑使用IEqualityComparer<string>

readonly IEqualityComparer<string> comparer = GetStringComparerForMyCulture();
var result = ...
    .Where(splitLine => !splitLine.Any(column => comparer.Equals(column, questionMark));

最新更新