当CSV包含字符和数字数据时,将CSV转换为XML

从这个线程,我得到了关于如何解析CSV以创建XML的基本信息。 不幸的是,文本字段(全部用引号括起来)有时包含逗号,所以line.split(’,’)给了我太多列。 我无法弄清楚如何解析CSV所以line.split(’,’)区分文本字段中的逗号和逗号分隔字段。 有关如何做到这一点的任何想法?

谢谢!

去抓住这个代码: http : //geekswithblogs.net/mwatson/archive/2004/09/04/10658.aspx

然后用SplitCSV(line)替换line.Split(“,”),如:

var lines = File.ReadAllLines(@"C:\text.csv"); var xml = new XElement("TopElement", lines.Select(line => new XElement("Item", SplitCSV(line) .Select((column, index) => new XElement("Column" + index, column))))); xml.Save(@"C:\xmlout.xml"); 

请注意,上面链接中的代码相当陈旧,可能可以使用Linq清理一下,但它应该可以解决问题。

试试FileHelpers 。

FileHelpers是一个免费且易于使用的.NET库,用于从文件,字符串或流中的固定长度或分隔记录中导入/导出数据。

怎么用管道字符“|”? 这通常发生在CSV文件中,更好的方法是分离管道。

如果您的CSV文件太复杂而无法编写自己的解析器,请使用另一个解析器。 Office ACE OLEDB提供程序可能已在您的系统上可用,但可能因您的目的而过度使用。 我没有使用任何轻量级替代品,所以我不能说它们的适用性。

如果您不想使用正则表达式,这里有一个小技巧。 您可以使用逗号和引号将“,”分开,而不是使用逗号分割。

假设逗号之前和之后没有空格:

 line.Split("\",\"") 

您需要在第一个字段之前和最后一个字段之后删除引号。

虽然我几乎总是反对正则表达式,但这是一个使用它的解决方案。

假设你有这样的数据:

 "first name","last name","phone number" "john,jane","doe","555-5555" 

然后,以下代码:

 string csv = GetCSV(); // will load your CSV, or the above data foreach (string line in csv.Split('\n')) { Console.WriteLine("--- Begin record ---"); foreach (Match m in Regex.Matches(line, "\".+?\"")) Console.WriteLine(m.Value); } 

将输出:

 --- Begin record --- "first name" "last name" "phone number" --- Begin record --- "john,jane" "doe" "555-5555" 

但是,如果你有一个2 GB的csv文件,我不会推荐使用Regex方法。
因此,您可以将其用作构成XML记录的基线。