tags:

views:

99

answers:

1

I need to Convert a CSV into an XML document. The examples I have seen so far, all show how to do this with a fixed number of columns in the CSV.

I have this so far, using LINQ:

String[] File = File.ReadAllLines(@"C:\text.csv");

        String xml = "";

        XElement top = new XElement("TopElement",

        from items in File

        let fields = items.Split(';')

        select new XElement("Item",

        new XElement("Column1", fields[0]),

        new XElement("Column2", fields[1]),

        new XElement("Column3", fields[2]),

        new XElement("Column4", fields[3]),

        new XElement("Column5", fields[4])

        )

        );

        File.WriteAllText(@"C:\xmlout.xml", xml + top.ToString());

This is for a fixed amount of columns, but my .CSV has a different number of columns on each line.

How would you fit some sort of loop into this, depending on how many words (columns) there are in each line of the .CSV?

Thnx

+5  A: 
var lines = File.ReadAllLines(@"C:\text.csv");

var xml = new XElement("TopElement",
   lines.Select(line => new XElement("Item",
      line.Split(';')
          .Select((column, index) => new XElement("Column" + index, column)))));

xml.Save(@"C:\xmlout.xml");

Input:

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

Output:

<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>
dtb
Pretty close. But I need to split eveery word on each line seperated by a ;So, the output XML would look something like this:<item> <Column>word</Column> <Column>word</Column> </item> <item> <Column>word</Column> </item><item> <Column>word</Column> <Column>word</Column> <Column>word</Column> <Column>word</Column> </item>I almost had it with the code I posted, but I only got the first word in each line. So I need to add some sort of loop, that adds a Column element for each word on each line seperated by a ;
Soeren
@Soeren: Isn't that what my solution does? I've added an example for clarification.
dtb
This works great. The line.Split(';') part wasn't in the first example, and I tried to add it myself. I just didn't know how to add it. I need to study this LINQ stuff some more. Thanks for your help.
Soeren