我正在将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文件中的任何内容?
答案 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)
有多种解决方案。
将可枚举转换为列表,然后从列表中删除。这有点贵。
创建一个功能。 //如果需要,您可以应用多个过滤器。
getElementById()
答案 4 :(得分:0)
读取CSV文件的另一种方法是使用TextFieldParser类。它具有CommentTokens
和Delimiters
可能会帮助您。
将;
指定为CommentTokens
可能会对您有所帮助。