【问题标题】:Convert CSV with unknown schema to XML将具有未知架构的 CSV 转换为 XML
【发布时间】:2023-03-20 16:10:01
【问题描述】:

我正在读取一个 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 的模式未定义时如何转换它? 文件包含标题行,但不知道有多少个标题以及什么是标题标题。

【问题讨论】:

  • 那么,对于 CSV 文件有什么定义吗?
  • 是的。这是一个有效的文件!
  • 你的意思是this valid?如“没有正式的规范存在”?
  • 是的,就是那种文件。
  • 一个小样本:您对以下 csv 文件的预期结果是什么:1,2;3,4?

标签: c# .net xml csv


【解决方案1】:

有了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>

希望这会有所帮助。

披露:我是这个库的作者

【讨论】:

  • 感谢您的回答。 Linq to sql 正在为我的目的工作,所以我不想添加新的库引用。但它肯定会对某人有所帮助!
【解决方案2】:

在没有解决之前,问题似乎要大得多!

但是,可以使用相同的 linq to xml 查询并进行一些修改。一时间我忘了我也可以在linq select查询中访问索引,

    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();
    }

【讨论】:

  • 请谨慎使用此解决方案,因为如果数据本身包含逗号或换行符,它将不起作用。
  • @user2366842,确实是的!正如我所说,如果文件有效,它将起作用。如果数据本身包含分隔符,它将被视为单独的数据值。但实际上我并没有使用静态逗号作为分隔符。
猜你喜欢
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 2013-10-04
  • 1970-01-01
  • 2018-07-30
相关资源
最近更新 更多