【问题标题】:Input array is longer than the columns in this table输入数组比此表中的列长
【发布时间】:2023-03-11 13:55:01
【问题描述】:

我有一个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 个标题为空。对于第二个文件,抛出异常:

输入数组长于该表的列数。

我希望第 10 个标头的值为 null。如何仅针对第 10 个标题执行此操作?

【问题讨论】:

    标签: c# asp.net csv exception


    【解决方案1】:

    您确定没有包含 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);
    }
    

    【讨论】:

    • @user3074200 您需要它们与 9 列的数据集中在同一个数据集中,还是在 10 列的不同数据集中?
    猜你喜欢
    • 2019-03-27
    • 2018-08-21
    • 2017-09-03
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多