输入数组比此表中的列长

时间:2014-03-20 05:57:29

标签: c# asp.net csv exception

我有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个标题执行此操作?

1 个答案:

答案 0 :(得分:0)

您确定没有包含9个标题但在任何行中有10个项目的csv文件吗?如果是这种情况,csvData.Rows.Add(fieldData);会将ArgumentExceptionAdditional 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);
}