我想读取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库,但没有得到解决方案。
答案 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])));