【发布时间】:2009-01-26 00:02:16
【问题描述】:
我正在使用 C# 2005 和 CSVreader 类,除了 CSV 文件在末尾包含一个空行之外,所有的工作都很好:
例子:
1,2,3,4,5
2,3,5,6,7
,,,,
我的程序错误,因为这里没有值,问题是并非所有列都包含一个值,所以下面的 2 行是有效的。
1,2,,4,5
2,,5,6,7
但包含 ,,,, 的空行不会。最后一个障碍是我不确定会有多少列。
您建议我如何测试空行?
【问题讨论】:
我正在使用 C# 2005 和 CSVreader 类,除了 CSV 文件在末尾包含一个空行之外,所有的工作都很好:
例子:
1,2,3,4,5
2,3,5,6,7
,,,,
我的程序错误,因为这里没有值,问题是并非所有列都包含一个值,所以下面的 2 行是有效的。
1,2,,4,5
2,,5,6,7
但包含 ,,,, 的空行不会。最后一个障碍是我不确定会有多少列。
您建议我如何测试空行?
【问题讨论】:
这个特殊的 CSVReader 看起来可以很好地处理缺失的字段:
您可以在调用阅读器之前使用类似这样的代码来处理空行:
csv.MissingFieldAction = MissingFieldAction.ReplaceByNull;
或替换为空字符串:
csv.MissingFieldAction = MissingFieldAction.ReplaceByEmpty;
然后您可以在读取后通过循环遍历它来测试空行,如果任何列不为空,则处理该行。
【讨论】:
阅读整行并向后工作。
【讨论】:
我过去遇到类似问题的方法是在您的 CSV 阅读器和您正在读取的实际流/字符串之间使用阅读器。使用中间体来消除垃圾并检查额外的行等,以防止读者在某些糟糕的输入中死去。
当然,如果内存不是问题,那么您可以简单地读取整个字符串,纠正一次,然后将其输入您的阅读器。
【讨论】:
这是很久以前的问题,但问题仍然出现在我面前。如果您在 NuGet() 上使用可用于 .NET C# 的 CSVHelper,则可以使用此代码跳过空白:
SoupToNuts record; //class with same columns found in csv file
List<SoupToNuts> SoupToNutsList = new List<SoupToNuts>();
while (csv.Read())
{
if (!csv.IsRecordEmpty())
{
record = csv.GetRecord<SoupToNuts>();
SoupToNutsList.Add(record);
}
}
【讨论】: