2017-08-11 55 views
0

我正在读取CSV文件并将其转换为XML格式。将CSV与未知架构转换为XML

public static string ConvertCSVToXML(string filePath) 
    { 
     var lines = File.ReadAllLines(filePath); 
     XElement xml = new XElement("RootElement", 
       from str in lines 
       let col = str.Split(',') 
       select new XElement("Item", 
        new XElement("Column1", col[0]), 
        new XElement("Column2", col[1]), 
        new XElement("Column3", col[2]), 
        new XElement("Column4", col[3]) 
        ) 
      ); 
     return xml.ToString(); 
    } 

在这里,我们知道CSV的标题,因此它的工作原理。 如何在CSV模式未定义时将其转换? 文件包含标题行,但不知道有多少标题和标题标题。

+0

那么,有没有什么关于CSV文件的定义? – grek40

+0

是的。这是一个有效的文件! –

+0

你的意思是[这个有效](https://tools.ietf.org/html/rfc4180)?如*中“没有存在的正式规范”*? – grek40

回答

0

问题似乎要大得多,直到它没有解决!

但是有可能使用相同的linq到xml查询进行一些修改。有那么一刻我忘了,我也可以访问该指数在LINQ选择查询,

public static string ConvertCSVToXML(string filePath, char seperator) 
    { 
     var lines = File.ReadAllLines(filePath); 
     var headers = lines[0].Split(seperator); 
     XElement xml = new XElement("RootElement", 
          lines.Select(line => new XElement("Item", 
           line.Split(seperator).Select((column, index) => 
            new XElement(headers[index], column)) 
          )) 
         ); 
     return xml.ToString(); 
    } 
+0

只需要小心使用此解决方案,因为如果数据本身包含逗号或换行符,它将无法正常工作。 – user2366842

+0

@ user2366842,的确如此!正如我所说,如果文件有效,它将工作。如果数据本身 包含分离器,则它将视为单独的数据值。但事实上,我没有使用静态逗号作为分隔符。 –

0

随着Cinchoo ETL - 一个开源的ETL框架,你可以很容易地

做到这一点对于一个样本CSV(users.csv以下的

Id,Name 
1,Washington 
2,Lincoln 

代码)文件显示了如何读取和生成XML文件

using (var reader = new ChoCSVReader("users.csv").WithFirstLineHeader()) 
{ 
    using (var writer = new ChoXmlWriter("users.xml").WithXPath("Emps/Emp")) 
     writer.Write(reader); 
} 

输出XML文件看起来如下

<Emps> 
    <Emp> 
    <Id>1</Id> 
    <Name>Washington</Name> 
    </Emp> 
    <Emp> 
    <Id>2</Id> 
    <Name>Lincoln</Name> 
    </Emp> 
</Emps> 

希望这有助于。

披露:我是该图书馆的作者

+0

感谢您的回答。 Linq to sql正在为我的目的而工作,所以我不想添加新的库引用。但它肯定会对某人有所帮助! –