我有csv_log_reader
:
DataTable csvData = new DataTable();
try
{
using (TextFieldParser csvReader = new TextFieldParser(csv_file_path))
{
csvReader.SetDelimiters(new string[] { "," });
csvReader.HasFieldsEnclosedInQuotes = true;
string[] colFields = csvReader.ReadFields();
foreach (string column in colFields)
{
DataColumn datecolumn = new DataColumn(column);
datecolumn.AllowDBNull = true;
csvData.Columns.Add(datecolumn);
}
while (!csvReader.EndOfData)
{
string[] fieldData = csvReader.ReadFields();
// Making empty value as null.
for (int i = 0; i < fieldData.Length; i++)
{
if (fieldData[i] == "")
{
fieldData[i] = null;
}
}
csvData.Rows.Add(fieldData);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return csvData;
对于第一个csv文件,我有9个标题。对于第二个csv文件,我有10个头,但第10个头是null。对于第二个文件,抛出异常:
输入数组比此表中的列数长。
我希望第10个标头的值为null
。我如何仅为第10个标题执行此操作?
答案 0 :(得分:0)
您确定没有包含9个标题但在任何行中有10个项目的csv文件吗?如果是这种情况,csvData.Rows.Add(fieldData);
会将ArgumentException
与Additional information: Input array is longer than the number of columns in this table.
一起作为异常消息。
导致此问题的示例输入:
HEADER1,HEADER2,HEADER3,HEADER4,HEADER5,HEADER6,HEADER7,HEADER8,HEADER9
1, 2, 3, 4, 5, 6, 7, 8, 9
1, 2, 3, 4, 5, 6, 7, 8, 9
1, 2, 3, 4, 5, 6, 7, 8, 9
1, 2, 3, 4, 5, 6, 7, 8, 9
1, 2, 3, 4, 5, 6, 7, 8, 9
1, 2, 3, 4, 5, 6, 7, 8, 9
1, 2, 3, 4, 5, 6, 7, 8, 9
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 // Processing this row with your code will throw an exception
1, 2, 3, 4, 5, 6, 7, 8, 9
如果您不能保证您的输入始终有效,您可以做的一件事就是防范这种情况。
try {
csvData.Rows.Add(fieldData);
} catch (ArgumentException ex) {
Console.Error.Write("Input: ");
fieldData.ToList().ForEach(d => Console.Error.Write(d + ", "));
Console.Error.WriteLine("Input error: the exception message: {0}", ex.Message);
}