将CSV文件转换为XML

我需要将CSV转换为XML文档。 我到目前为止看到的示例都显示了如何使用CSV中的固定数量的列进行此操作。

到目前为止我使用LINQ:

String[] File = File.ReadAllLines(@"C:\text.csv"); String xml = ""; XElement top = new XElement("TopElement", from items in File let fields = items.Split(';') select new XElement("Item", new XElement("Column1", fields[0]), new XElement("Column2", fields[1]), new XElement("Column3", fields[2]), new XElement("Column4", fields[3]), new XElement("Column5", fields[4]) ) ); File.WriteAllText(@"C:\xmlout.xml", xml + top.ToString()); 

这适用于固定数量的列,但我的.CSV在每行上具有不同的列数。

根据.CSV每行中有多少单词(列),你会如何适应这种循环?

日Thnx

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

输入:

 A;B;C D;E;F G;H 

输出:

   A B C   D E F   G H   

如果您想使用标题作为元素名称:

 var lines = File.ReadAllLines(@"C:\text.csv"); string[] headers = lines[0].Split(',').Select(x => x.Trim('\"')).ToArray(); var xml = new XElement("TopElement", lines.Where((line, index) => index > 0).Select(line => new XElement("Item", line.Split(',').Select((column, index) => new XElement(headers[index], column))))); xml.Save(@"C:\xmlout.xml"); 

我写了一个源自Vlax片段的课程。 另外,我提供了一个unit testing来记录工作流程。

unit testing:

 [TestMethod] public void convert_csv_to_xml() { // Setup var csvPath = @"Testware\vendor.csv"; var xmlPath = @"Testware\vendor.xml"; // Test var success = DocumentConverter.Instance.CsvToXml(csvPath, xmlPath); // Verify var expected = File.Exists(xmlPath) && success; Assert.AreEqual(true, expected); } 

CSV到XML:

 public class DocumentConverter { #region Singleton static DocumentConverter _documentConverter = null; private DocumentConverter() { } public static DocumentConverter Instance { get { if (_documentConverter == null) { _documentConverter = new DocumentConverter(); } return _documentConverter; } } #endregion public bool CsvToXml(string sourcePath, string destinationPath) { var success = false; var fileExists = File.Exists(sourcePath); if (!fileExists) { return success; } var formatedLines = LoadCsv(sourcePath); var headers = formatedLines[0].Split(',').Select(x => x.Trim('\"').Replace(" ", string.Empty)).ToArray(); var xml = new XElement("VendorParts", formatedLines.Where((line, index) => index > 0). Select(line => new XElement("Part", line.Split(',').Select((field, index) => new XElement(headers[index], field))))); try { xml.Save(destinationPath); success = true; } catch (Exception ex) { success = false; var baseException = ex.GetBaseException(); Debug.Write(baseException.Message); } return success; } private List LoadCsv(string sourcePath) { var lines = File.ReadAllLines(sourcePath).ToList(); var formatedLines = new List(); foreach (var line in lines) { var formatedLine = line.TrimEnd(','); formatedLines.Add(formatedLine); } return formatedLines; } } 

注意:

我通过删除每个CSV行条目的尾随逗号来扩展Vlax的解决方案,这些逗号基于索引超出列标题的范围而导致运行时exception。

Cinchoo ETL – 一个开源库,可以通过几行代码轻松地将CSV转换为Xml

对于示例CSV:

 string csv = @"Id, Name, City 1, Tom, NY 2, Mark, NJ 3, Lou, FL 4, Smith, PA 5, Raj, DC "; StringBuilder sb = new StringBuilder(); using (var p = ChoCSVReader.LoadText(csv) .WithFirstLineHeader() ) { using (var w = new ChoXmlWriter(sb) .Configure(c => c.RootName = "Employees") .Configure(c => c.NodeName = "Employee") ) w.Write(p); } Console.WriteLine(sb.ToString()); 

输出Xml:

   1 Tom NY   2 Mark NJ   3 Lou FL   4 Smith PA   5 Raj DC   

Checkout CodeProject文章提供了一些额外的帮助。

免责声明:我是这个图书馆的作者。