Solución:
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");
Aporte:
A;B;C
D;E;F
G;H
Producción:
<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>
En caso de que desee utilizar los encabezados como nombres de elementos:
var lines = File.ReadAllLines(@"C:text.csv");
string[] headers = lines[0].Split(',').Select(x => x.Trim('"')).ToArray();
var xml = new XElement("TopElement",
lines.Where((line, index) => index > 0).Select(line => new XElement("Item",
line.Split(',').Select((column, index) => new XElement(headers[index], column)))));
xml.Save(@"C:xmlout.xml");
Escribí una clase que se deriva del fragmento de Vlax. Además, proporcioné una prueba unitaria para documentar el flujo de trabajo.
Prueba de unidad:
[TestMethod]
public void convert_csv_to_xml()
{
// Setup
var csvPath = @"Testwarevendor.csv";
var xmlPath = @"Testwarevendor.xml";
// Test
var success = DocumentConverter.Instance.CsvToXml(csvPath, xmlPath);
// Verify
var expected = File.Exists(xmlPath) && success;
Assert.AreEqual(true, expected);
}
CSV a XML:
public class DocumentConverter
{
#region Singleton
static DocumentConverter _documentConverter = null;
private DocumentConverter() { }
public static DocumentConverter Instance
{
get
{
if (_documentConverter == null)
{
_documentConverter = new DocumentConverter();
}
return _documentConverter;
}
}
#endregion
public bool CsvToXml(string sourcePath, string destinationPath)
{
var success = false;
var fileExists = File.Exists(sourcePath);
if (!fileExists)
{
return success;
}
var formatedLines = LoadCsv(sourcePath);
var headers = formatedLines[0].Split(',').Select(x => x.Trim('"').Replace(" ", string.Empty)).ToArray();
var xml = new XElement("VendorParts",
formatedLines.Where((line, index) => index > 0).
Select(line => new XElement("Part",
line.Split(',').Select((field, index) => new XElement(headers[index], field)))));
try
{
xml.Save(destinationPath);
success = true;
}
catch (Exception ex)
{
success = false;
var baseException = ex.GetBaseException();
Debug.Write(baseException.Message);
}
return success;
}
private List<string> LoadCsv(string sourcePath)
{
var lines = File.ReadAllLines(sourcePath).ToList();
var formatedLines = new List<string>();
foreach (var line in lines)
{
var formatedLine = line.TrimEnd(',');
formatedLines.Add(formatedLine);
}
return formatedLines;
}
}
NOTA:
Extendí la solución de Vlax eliminando una coma final para cada una de las entradas de línea CSV que causaron una excepción de tiempo de ejecución basada en un índice que estaba fuera de los límites en relación con el encabezado de la columna.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)