忽略没有数据的 CSV 行

Ignoring CSV rows with no data

令我惊讶的是我在这里没有看到任何关于此的内容(或者我错过了)。解析CSV文件时,如果有行没有数据,如何处理can/should?我说的不是空行,而是空行,例如:

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

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

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;
            }
        }

    }
}

如果不使用第三方 CSV reader,您可以用这种方式更改您的代码

.....
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 的每个元素。如果 return 为真,则您有一个空字符串数组,您可以跳过 Add

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

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

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

http://ideone.com/8wKOVD

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

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

我知道这确实是几年后的事了,但我最近遇到了这个问题,并且能够找到与之前的回复类似的解决方法。你可以看到整个冲洗出来的功能

        public static DataTable CSVToDataTable(IFormFile file)
        {
            DataTable dt = new DataTable();
            using (StreamReader sr = new StreamReader(file.OpenReadStream()))
            {
                string[] headers = sr.ReadLine().Split(',');
                foreach (string header in headers)
                {
                    dt.Columns.Add(header);
                }

                var txt = sr.ReadToEnd();
                var stringReader = new StringReader(txt);
                TextFieldParser parser = new TextFieldParser(stringReader);
                parser.HasFieldsEnclosedInQuotes = true;
                parser.SetDelimiters(",");

                while (!parser.EndOfData)
                {
                    
                    string[] rows = parser.ReadFields();
                    string tmpStr = string.Join("", rows);
                    if (!string.IsNullOrWhiteSpace(tmpStr))
                    {
                        DataRow dr = dt.NewRow();
                        for (int i = 0; i < headers.Length; i++)
                        {
                            dr[i] = rows[i];
                        }
                        dt.Rows.Add(dr);
                    }                   
                }
            }
            return dt;
        }

它对我很有用,并且被证明相当可靠。调用 .ReadFields() 后在 WHILE 循环中找到主要代码段——我将返回的行连接到一个字符串,然后检查它是否为 nullorempty。希望这可以帮助偶然发现此问题的人。