忽略没有数据的 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 */}
似乎没有比我提供的解决方案更好的解决方案了。在将其添加到我的数据表之前,我只需要遍历所有字段并查看它们是否都是空的。
我找到的唯一其他解决方案是史蒂夫的答案,即不使用 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。希望这可以帮助偶然发现此问题的人。
令我惊讶的是我在这里没有看到任何关于此的内容(或者我错过了)。解析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 */}
似乎没有比我提供的解决方案更好的解决方案了。在将其添加到我的数据表之前,我只需要遍历所有字段并查看它们是否都是空的。
我找到的唯一其他解决方案是史蒂夫的答案,即不使用 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。希望这可以帮助偶然发现此问题的人。