如何从IEnumerable中删除行

时间:2018-07-04 12:33:45

标签: c# ienumerable

我正在将CSV文件加载到IEnumerable中。

  string[] fileNames = Directory.GetFiles(@"read\", "*.csv");
  for (int i = 0; i < fileNames.Length; i++)
  { 
       string file = @"read\" + Path.GetFileName(fileNames[i]);
       var lines   = from rawLine in File.ReadLines(file, Encoding.Default)
                     where !string.IsNullOrEmpty(rawLine) 
                     select rawLine;
  }

此后,我使用数据,但现在有几个文件几乎是空的,只有“ ;;;;;;” (金额不同)写在里面。

如何在使用这些行之前删除这些行,并且不更改csv文件中的任何内容?

5 个答案:

答案 0 :(得分:3)

您无法从IEnumerable中删除任何内容(例如从List<T>中删除),但是您可以添加过滤器:

lines = lines.Where(l => !l.Trim().All(c => c == ';'));

这不会删除任何内容,但是您将不再处理这些行。

答案 1 :(得分:3)

如果每行;个字符的数量是可变的,这就是您的“ where”条件的样子:

where !string.IsNullOrEmpty(rawLine) && !string.IsNullOrEmpty(rawLine.Trim(';'))

rawLine.Trim(';')将返回删除了所有;个字符的字符串的副本。如果此新字符串为空,则表示该行可以忽略,因为它仅包含;个字符。

答案 2 :(得分:1)

您无法从可枚举-https://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx中删除行。

相反,请尝试使用过滤后的数据创建一个新数组,或者在显示的where子句中对其进行过滤,如下所示:

string[] fileNames = Directory.GetFiles(@"read\", "*.csv");
         for (int i = 0; i < fileNames.Length; i++)
            { string file = @"read\" + Path.GetFileName(fileNames[i]);
var lines = from rawLine in File.ReadLines(file, Encoding.Default) where !string.IsNullOrEmpty(rawLine) && rawLine != ";;;;;;" select rawLine;}

答案 3 :(得分:0)

有多种解决方案。

  1. 将可枚举转换为列表,然后从列表中删除。这有点贵。

  2. 创建一个功能。 //如果需要,您可以应用多个过滤器。

    getElementById()

答案 4 :(得分:0)

读取CSV文件的另一种方法是使用TextFieldParser类。它具有CommentTokensDelimiters可能会帮助您。

;指定为CommentTokens可能会对您有所帮助。

Tutorial