轻松实现:使用 LINQ 将 CSV 文件转换为 XML






4.44/5 (7投票s)
一个小型例程,使用 LINQ 将 CSV 文件转换为格式良好的 XML 文档。
引言
最近,我开发了一个 Windows 应用程序,该应用程序通过 CSV 文件接收信息。我需要查询信息以提取值并进行一系列统计计算,显然,CSV 格式并不是理想的方式。
我在互联网上进行了一些研究,但没有找到任何可以完成这项工作的免费代码。因此,我决定自己编写,令人惊讶的是,我发现了一种使用 LINQ to XML 的简单方法。
在本文中,我公开了代码和一个小型控制台程序来测试它。您可以根据需要使用它。尽情享受吧!
背景
这里描述的方法将具有不确定数量的行和字段的 CSV 文件转换为格式良好的 XML 文件。
CSV 限制:CSV 文件需要第一行包含字段名称,如下例所示
Name, Surname, Country, Job, Cabin
Garcia, Jose, Cuba,Software Developer,345A
Lenon,Tim,USA,SoftwareDeveloper,444
Rusell, Anthony, UK,Web Designer,345
Wolf, Werner, Germany,Linux IT,234
该例程将文件转换为以下 XML 文档
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<root>
<row>
<var name="Name" value="Garcia" />
<var name=" Surname" value=" Jose" />
<var name=" Country" value=" Cuba" />
<var name=" Job" value="Software Developer" />
</row>
<row>
...
</row>
</root>
这是一个扁平的 XML 文件,所有字段都转换为一个包含变量名和变量值的 value 元素。对于每一行,都会重复此模式。
使用代码
代码很简单。与需要实现 XML 结构的 DOM 的繁琐构造不同,LINQ 使过程出奇地简单。我们使用 XDocument
,这是 LINQ 用于管理 XML InfoSet 的类。
您可以在以下代码中看到它
using System;
using System.Xml.Linq;
namespace jagg.CsvToXml
{
public static class ConversorCsvXml
{
/// <summary>
/// Conversion the input file from csv format to XML
/// Conversion Method
/// </summary>
/// <param name="csvString" >
/// cvs string to converted
/// </param>
/// <param name="separatorField">
/// separator used by the csv file
/// </param>
/// <return>
/// XDocument with the created XML
/// </return>
public static XDocument ConvertCsvToXML(string csvString, string[] separatorField)
{
//split the rows
var sep = new[] {"\r\n"};
string[] rows = csvString.Split(sep, StringSplitOptions.RemoveEmptyEntries);
//Create the declaration
var xsurvey = new XDocument(
new XDeclaration("1.0", "UTF-8", "yes"));
var xroot = new XElement("root"); //Create the root
for (int i = 0; i < rows.Length; i++)
{
//Create each row
if (i > 0)
{
xroot.Add(rowCreator(rows[i], rows[0], separatorField));
}
}
xsurvey.Add(xroot);
return xsurvey;
}
/// <summary>
/// Private. Take a csv line and convert in a row - var node
/// with the fields values as attributes.
/// <param name=""row"" />csv row to process</param />
/// <param name=""firstRow"" />First row with the fields names</param />
/// <param name=""separatorField"" />separator string use in the csv fields</param />
/// </summary></returns />
private static XElement rowCreator(string row,
string firstRow, string[] separatorField)
{
string[] temp = row.Split(separatorField, StringSplitOptions.None);
string[] names = firstRow.Split(separatorField, StringSplitOptions.None);
var xrow = new XElement("row");
for (int i = 0; i < temp.Length ; i++)
{
//Create the element var and Attributes with the field name and value
var xvar = new XElement("var",
new XAttribute("name", names[i]),
new XAttribute("value", temp[i]));
xrow.Add(xvar);
}
return xrow;
}
}
}
要使用该类,您只需要使用适当的参数调用 ConvertCsvToXML
方法。该类是 static
的,您无需创建它。注释格式不佳,请在您的代码中更正它们。
这是一个小型测试程序,它将我们的 CSV 示例转换为 XML
using System;
using System.IO;
using System.Xml.Linq;
using jagg.CsvToXml;
namespace TestCsvToXml
{
internal class Program
{
/// <summary>
/// Simple test conversion
/// </summary>
private static void Main()
{
string csv = File.ReadAllText("csvexample.csv");
XDocument doc = ConversorCsvXml.ConvertCsvToXML(csv, new[] {","});
doc.Save("outputxml.xml");
Console.WriteLine(doc.Declaration);
foreach (XElement c in doc.Elements())
{
Console.WriteLine(c);
}
Console.ReadLine();
}
}
}
此代码将结果存储在 outputxml.xml 文件中,并在控制台中显示生成的 XML
关注点
这个类向我们展示了使用 LINQ 可以简化我们的程序。如果您使用过 DOM,可以比较一下这两种模型,看看 LINQ 如何极大地简化 XML 文档的构造。
历史
- 2009 年 1 月 19 日 - 首次版本。