[英]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 輸出正常工作。 謝謝!
一些讓你開始的東西:
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.