2

我很惊讶我在这里没有看到任何关于这个的东西(或者我可能错过了)。解析 CSV 文件时,如果存在没有数据的行,如何/应该如何处理?我不是在谈论空行,而是空行,例如:

ID,Name,Quantity,Price
1,Stuff,2,5
2,Things,1,2.5
,,,
,,,
,,,

我正在使用 TextFieldParser 来处理数据中的逗号、多个分隔符等。我想到的两个解决方案是使用 ReadLine 而不是 ReadFields,但这会消除使用 TextFieldParser 的好处,我假设,因为那时我必须以不同的方式处理逗号。另一种选择是遍历字段并在所有字段为空时删除该行。这是我所拥有的:

dttExcelTable = new DataTable();

using (TextFieldParser parser = new TextFieldParser(fileName))
{
    parser.Delimiters = new string[] { ",", "|" };

    string[] fields = parser.ReadFields();
    if (fields == null)
    {
       return null;
    }
    foreach (string columnHeader in fields)
    {
       dttExcelTable.Columns.Add(columnHeader);
    }

    while (true)
    {
        DataRow importedRow = dttExcelTable.NewRow();
        fields = parser.ReadFields();
        if (fields == null)
        {
            break;
        }
        for (int i = 0; i < fields.Length; i++)
        {
            importedRow[i] = fields[i];
        }

        foreach (var field in importedRow.ItemArray)
        {
            if (!string.IsNullOrEmpty(field.ToString()))
            {
                dttExcelTable.Rows.Add(importedRow);
                break;
            }
        }

    }
}
4

3 回答 3

3

在不使用第三方 CSV 阅读器的情况下,您可以通过这种方式更改您的代码

.....
DataRow importedRow = dttExcelTable.NewRow();
for (int i = 0; i < fields.Length; i++)
    importedRow[i] = fields[i];

if(!importedRow.ItemArray.All (ia => string.IsNullOrWhiteSpace(ia.ToString())))
     dttExcelTable.Rows.Add(importedRow);

使用 All IEnumerable 扩展,您可以使用 string.IsNullOrWhiteSpace 检查 ItemArray 的每个元素。如果返回为真,则您有一个空字符串数组,您可以跳过添加

于 2015-07-14T17:28:18.147 回答
0

似乎没有比我提供的更好的解决方案。在将其添加到我的数据表之前,我只需要遍历所有字段并查看它们是否都是空的。

我发现的唯一其他解决方案是史蒂夫的答案,即不使用 TextFieldParser

于 2015-07-21T18:18:54.180 回答
0

您可以将行中的逗号替换为空,并测试它是否为空。

strTemp = s.Replace(",", "");

if (!String.IsNullOrEmpty(strTemp)) { /*code here */}

http://ideone.com/8wKOVD

于 2015-07-14T17:42:02.530 回答