CSV文件上的C#IndexOutOfRangeException

时间:2013-07-05 12:32:19

标签: c# csv linq-to-xml indexoutofboundsexception

我想读取CSV文件并从中编写XML文件。我理解csv线如何拆分的基本思路。但我的代码给了我一个例外,我不明白。

首先是代码:

    static void Main(string[] args)
    {
       Console.WriteLine("Insert Filename please");
       string path = Console.ReadLine();

           string[] source = File.ReadAllLines(path);
           XElement output = new XElement("Consumer",
               from str in source
               let fields = str.Split(',')
               select new XElement("consumer",
                   new XElement(fields[0],
                   new XAttribute(fields[1], fields[2]),
                   new XAttribute(fields[3], fields[4])
                   )));

                Console.WriteLine(output);
                Console.ReadLine();
    }

}

} 这就是代码,当我调试它时,我得到一条失败消息,说它是“OutOfRangeException”。我知道这种异常意味着什么,但我找不到解决方案。我将逗号之间的每个字符解释为字段。因此,通常,Array不应大于CSV文件中的字段数量。为什么我现在得到OutOfBounds,对我来说是神秘的。

非常感谢您阅读和帮助:)

编辑:我使用的CSV文件已损坏,因此我没有得到任何有用的信息。我修复了代码,但只要CSV不包含空字段。弹出sais的例外,“一个名字不能以Charakter'开头,十六进制值0x20。我不知道如何处理这个问题。我尝试使用Lumenworks的FastCSVReader库,但没有得到解决方案。

1 个答案:

答案 0 :(得分:2)

必须至少有一行少于37个字段。也许最后还有一个空白?

您可以在继续之前尝试检查fields.Length,即:

XElement toXML = new XElement("Root",
from str in source
let fields = str.Split(',')
where fields.Length >= 37 // <==== Check #fields
select new XElement("Consumer",
            new XAttribute("name", fields[0]),
        new XElement(fields[3]),
            new XAttribute(fields[4], fields[5]),
            new XAttribute(fields[6], fields[7]),
            new XAttribute(fields[8], fields[9]),
            new XAttribute(fields[10], fields[11]),
            new XAttribute(fields[12], fields[13]),
            new XAttribute(fields[14], fields[15]),
            new XAttribute(fields[16], fields[17]),
            new XAttribute(fields[18], fields[19]),
            new XAttribute(fields[20], fields[21]),
        new XElement(fields[22]),
              new XAttribute(fields[24], fields[25]),
              new XAttribute(fields[26], fields[27]),
              new XAttribute(fields[28], fields[29]),
        new XElement(fields[30]),
              new XAttribute(fields[32], ""),
              new XAttribute(fields[33], fields[34]),
              new XAttribute(fields[35], fields[36])));