2011-09-19 185 views
1

我知道將CSV文件轉換爲XML的基本功能,但是我的CSV文件有不同的列,我還需要它將其分開。我如何使用C#並將我的CSV文件到這個XML文件?謝謝你的幫助!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.please幫助XML所需的列和行的! 這是我迄今爲止使用的代碼,但它不會爲我工作,因爲我有一個特定的行,有些數據我需要7行一些我需要9或10.plus我需要創建一個新的類別,如< 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 ,屋頂,DAY,abc,34 B4,01.00,02.00,garden,Day,abc,27,2.00M,2 請告訴我如何更改我的CSV代碼以讓我所需的XML輸出正常工作。謝謝!

+1

你嘗試過這麼遠嗎?什麼不行?請顯示一些源代碼... – Yahia

+2

發佈您到目前爲止的代碼,並指出爲什麼你不認爲它有效。 – razlebe

+2

XML的塊不是很有用。你應該解釋你的輸入格式和所需的輸出格式,以及你遇到困難的地方,否則這可能會被關閉。 –

回答

5

的東西,讓你開始:

  • 使用System.Xml.Linq的
  • 支持不同的分隔符,
  • 演示使用標題行的元素名稱
  • 演示瞭如何添加linenumbers


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