删除列包含特定文本的行

时间:2019-04-03 18:02:27

标签: c# arrays .net linq

我想删除其列包含?的数据的所有行,例如在大约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;

2 个答案:

答案 0 :(得分:0)

您忘记反转包含的内容:

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。如果没有,则说明编码有问题。

答案 1 :(得分:0)

您写道:

  

我要删除其列包含“?”的数据的所有行

您永远无法使用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));