【问题标题】:Ignoring CSV rows with no data忽略没有数据的 CSV 行
【发布时间】:2015-07-14 16:18:53
【问题描述】:

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

    }
}

【问题讨论】:

    标签: c# csv textfieldparser


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      strTemp = s.Replace(",", "");
      
      if (!String.IsNullOrEmpty(strTemp)) { /*code here */}
      

      http://ideone.com/8wKOVD

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2012-07-06
          • 1970-01-01
          • 2011-03-15
          • 2015-07-20
          • 1970-01-01
          • 2013-06-10
          相关资源
          最近更新 更多