繁体   English   中英

c#如何将csv转换为xml

[英]c# how to convert csv to xml

我知道将 CSV 文件转换为 XML 的基本知识,但我的 CSV 文件有不同的列,我还需要它以不同的方式拆分它。我如何使用 C# 并将我的 CSV 文件转换为这个 XML 文件? 感谢您的帮助!

        <CARS>
       <NAME="amk">
         <CAR>
            <id>A1</id>
            <start>12.00</start>
            <end>11.59</end>
            <place>PARK</place>
            <day>DAY</day>
            <letter>abc</letter>
            <number>77</number>
         </CAR>

         <CAR>
            <id>A2</id>
            <start>01.00</start>
            <end>12.59</end>
            <place>garden</place>
            <day>night</day>
            <letter>abc</letter>
            <number>27</number>
            <length>2.15M</length>
            <amount>12</amount>
         </CAR>

         <CAR>...</CAR>

         <CAR>...</CAR>

        <NAME="bbk">
         <CAR>
            <id>B1</id>
            <start>23.59</start>
            <end>11.59</end>
            <place>Rooftop</place>
            <day>DAY</day>
            <letter>abc</letter>
            <number>34</number>
         </CAR>

         <CAR>
            <id>B4</id>
            <start>01.00</start>
            <end>02.00</end>
            <place>garden</place>
            <day>Day</day>
            <letter>abc</letter>
            <number>27</number>
            <length>2.00M</length>
            <amount>2</amount>
         </CAR>

             <CAR>...</CAR>

             <CAR>...</CAR>


         </NAME>
    </CARS>



public static void ConvertCsvToXML()
        {
            String[] FileContent = File.ReadAllLines(@"C:\test.csv");
            String XMLNS = "";
            XElement Inv = new XElement("CARS",

            from AREA in FileContent
            let fields = AREA.Split(',')
            select new XElement("Area", fields[0]),

            from CAR in FileContent
            let fields = CAR.Split(',')
            select new XElement("Car",
            new XElement("id", fields[1]),
            new XElement("start", fields[2]),
            new XElement("end", fields[3]),
            new XElement("place", fields[4]),
            new XElement("day", fields[5]),
            new XElement("letter", fields[6]),
            new XElement("number", fields[7]),
            new XElement("length", fields[8]),
            new XElement("amount", fields[9])
            )
            );
            File.WriteAllText(@"C:\testCSV.xml", XMLNS + Inv.ToString());
        }

有一百多个数据,但需要从 CSV 导入到 XML 中不同数量的列和行。请帮助! 这是到目前为止我一直在使用的代码,但它对我不起作用,因为我没有特定的行,有些数据我需要 7 行,有些我需要 9 或 10。另外我需要创建一个新类别,例如 < NAME ="bbk"> 并将数据放入其中。 谢谢你的帮助。

我的 CSV 源代码例如是 amk, A1,12.00,11.59,PARK,DAY,abc,77 A1,01.00,12.59,garden,night,abc,27,2.15M,12 bbk, B1,23.59,11.59,Rooftop,DAY ,abc,34 B4,01.00,02.00,garden,Day,abc,27,2.00M,2 请告诉我我需要如何更改我的 CSV 代码才能让我想要的 XML 输出正常工作。 谢谢!

一些让你开始的东西:

  • 使用 System.Xml.Linq
  • 支持不同的分隔符,
  • 演示使用元素名称的标题行
  • 演示显示如何添加行号


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml.Linq;

namespace TestProgram
{
    static class Program
    {
        // NET4 has this in System.IO.File
        private static IEnumerable<string> ReadAllLines(string fname)
        {
            using (var r = new StreamReader(fname))
            {
                var line = r.ReadLine();
                while (null != line)
                {
                    yield return line;
                    line = r.ReadLine();
                }
            }
        }

        private static string[] CsvFields(string line, char[] delim)
        {
            return null==line 
                ? null 
                : line.Split(delim, StringSplitOptions.None);
        }

        public static IEnumerable<T> ProjectCsv<T>(this IEnumerable<string> lines, char[] delim, Func<string[], T> projection)
        {
            return lines.Select(l => projection(CsvFields(l, delim)));
        }

        public static IEnumerable<T> ProjectCsv<T>(this IEnumerable<string> lines, char[] delim, Func<string[], int, T> projection)
        {
            return lines.Select((l, i) => projection(CsvFields(l, delim), i));
        }

        static void Main(string[] args)
        {
            foreach (var filename in args)
            {
                var csv = ReadAllLines(filename);

                var delimiter = new[] { '\t' };
                var headers = CsvFields(csv.First(), delimiter);

                Console.WriteLine(
                    new XDocument(new XElement("CSV",
                        new XAttribute("source", filename),
                        csv.ProjectCsv(delimiter, (fields, linenum) =>
                            new XElement("Line",
                                new XAttribute("number", linenum),
                                headers.Select((caption, index) => new XElement(caption, new XText(fields[index])))
                    ))))
                );
            }

            Console.WriteLine("Done, press a key");
            Console.ReadKey();
        }
    }
}

用法:

Program.exe E:\test.csv E:\test2.csv

示例 test.csv:

aap noot    mies
1   2   3
2   3   4
3   4   5
4   5   6
5   6   7
6   7   8

示例输出:

<CSV source="e:\test.csv">
  <Line number="0">
    <aap>aap</aap>
    <noot>noot</noot>
    <mies>mies</mies>
  </Line>
  <Line number="1">
    <aap>1</aap>
    <noot>2</noot>
    <mies>3</mies>
  </Line>
  <Line number="2">
    <aap>2</aap>
    <noot>3</noot>
    <mies>4</mies>
  </Line>
  <Line number="3">
    <aap>3</aap>
    <noot>4</noot>
    <mies>5</mies>
  </Line>
  <Line number="4">
    <aap>4</aap>
    <noot>5</noot>
    <mies>6</mies>
  </Line>
  <Line number="5">
    <aap>5</aap>
    <noot>6</noot>
    <mies>7</mies>
  </Line>
  <Line number="6">
    <aap>6</aap>
    <noot>7</noot>
    <mies>8</mies>
  </Line>
</CSV>
Done, press a key

这里给出了一个更简单的解决方案,容易理解。

文件input.csv作为输入:

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

流程代码:

Program.cs

using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;

namespace CSVtoXML
{
    class Program
    {
        private static void AddContentForEachLine(string line, ref XElement xmlTree)
        {
            var currentTree = new XElement("Item");
            const string delimiter = ",";     // Can be changed based on the actual situation
            string[] slices = line.Split(delimiter);

            for (int i = 0; i < slices.Count(); i++)
                currentTree.Add(new XElement($"Column{i}", slices[i].ToString()));

            xmlTree.Add(currentTree);
        }

        static void Main(string[] args)
        {
            var basePath = Environment.CurrentDirectory;
            var lines = File.ReadAllLines(Path.Combine(basePath, "../../..", @"input.csv"));

            var xmlTree = new XElement("TopElement");

            foreach (var line in lines)
            {
                AddContentForEachLine(line, ref xmlTree);
            }

            xmlTree.Save(Path.Combine(basePath, "../../..", @"output.xml"));
        }
    }
}

运行代码后,结果如下:

<?xml version="1.0" encoding="utf-8"?>
<TopElement>
  <Item>
    <Column0>A</Column0>
    <Column1>B</Column1>
    <Column2>C</Column2>
  </Item>
  <Item>
    <Column0>D</Column0>
    <Column1>E</Column1>
    <Column2>F</Column2>
  </Item>
  <Item>
    <Column0>G</Column0>
    <Column1>H</Column1>
  </Item>
</TopElement>

参考:

将元素、属性和节点添加到 XML 树 (C#) | 微软文档https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/adding-elements-attributes-and-nodes-to-an-xml-tree

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM