65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.44/5 (7投票s)

2009年1月19日

CPOL

2分钟阅读

viewsIcon

99061

downloadIcon

1805

一个小型例程,使用 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

ConvertCsvToXml/ConversorCSVXml.jpg

关注点

这个类向我们展示了使用 LINQ 可以简化我们的程序。如果您使用过 DOM,可以比较一下这两种模型,看看 LINQ 如何极大地简化 XML 文档的构造。

历史

  • 2009 年 1 月 19 日 - 首次版本。
© . All rights reserved.