忽略没有数据的CSV行

时间:2015-07-14 16:18:54

标签: c# csv textfieldparser

我很惊讶我在这里没有看到任何相关内容(或许我错过了)。在解析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;
            }
        }

    }
}

3 个答案:

答案 0 :(得分:2)

如果不使用第三方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的每个元素。如果返回为true,则表示您有一个空字符串数组,您可以跳过Add

答案 1 :(得分:0)

你可以只删除行中的逗号,如果它为null,则测试它。

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

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

http://ideone.com/8wKOVD

答案 2 :(得分:0)

似乎没有比我提供的解决方案更好的解决方案。我只需要遍历所有字段,看看它们是否都是空的,然后再添加到我的数据表中。

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

相关问题