Convertire un file CSV in XML mediante DataTable in Visual Basic (it-IT)
Finalità
In questo breve articolo, vedremo come sia possibile convertire un file CSV nella sua rappresentazione XML utilizzando Visual Basic e le potenti funzionalità della classe DataTable. Quando si opera nell'ambito del data management, la conversione di flussi dati in formati diversi è un compito quotidiano, e può essere utile disporre di metodi rapidi per effettuare operazioni di questo tipo.
Dati di esempio
Riferendoci ad un file CSV, supponiamo di avere un file di nome "example.txt", sito nella cartella C:\Temp. Il suo contenuto sarà qualcosa del tipo:
1;John Doe;40
2;Mark Nosurname;35
3;Jane Doe;32
4;Without name;60
Funzione CsvToXML
Vediamo la funzione di conversione, corredata da alcune considerazioni successive.
Private Sub CsvToXml(_inputFile As String, _dataName As String, _separator As Char, _outputFile As String, Optional _fieldnames() As String = Nothing)
Dim dt As New DataTable(_dataName)
Dim firstRow As Boolean = True
Using sr As New StreamReader(_inputFile)
While Not (sr.EndOfStream)
Dim fields() As String = sr.ReadLine.Split(_separator)
If firstRow Then
For ii As Integer = 0 To fields.Count - 1
Dim _fName As String = ""
If IsNothing(_fieldnames) Then
_fName = "Field" & ii.ToString("000")
Else
_fName = _fieldnames(ii)
End If
dt.Columns.Add(_fName)
Next
firstRow = False
End If
dt.Rows.Add(fields)
End While
dt.WriteXml(_outputFile)
dt.Dispose()
End Using
End Sub
La funzione richiede il percorso del file CSV in input (_inputFile), il nome da assegnare alla nostra entità XML principale (_dataName), Il carattere da utilizzare come separatore di campo (_separator), il percorso del file XML di output (_outputFile), ed un array opzione di stringhe, il quale rappresenta dei nomi specifici da assegnare ai vari campi (_fieldnames).
La routine inizia con la creazione di un nuovo DataTable, e con l'apertura del file CSV. Nel leggere la prima linea, verranno create le colonne necessarie al DataTable: se avremo passato l'argomento _fieldnames, la funzione userà le nostre stringhe, viceversa assegnerà alle colonne nomi generici come "FieldXYZ", dove "XYZ" è un valore sostituito dall'indice della colonna stessa.
In un loop while, processiamo ciascuna riga del file CSV, dividendone i campi tramite il carattere _separator, ed assegnando ciascun campo così ricavato ad un array locale di stringhe, quest'ultimo usato poi come parametro per il metodo standard Rows.Add, relativo all'oggetto DataTable. Al termine del ciclo, avremo una DataTable compilata con colonne e righe che riflettono il contenuto del file CSV in ingresso.
Chiamando il metodo WriteXML, produrremo la rappresentazione XML dei dati presenti nell'oggetto DataTable.
Risultato finale
Supponendo che i dati ingresso riflettano quelli riportati sopra, potremo chiamare la funzione mediante un'istruzione di questo tipo:
Dim fieldNames() As String = {"Id", "Name", "Age"}
CsvToXml("c:\temp\example.txt", "TempTable", ";", "c:\temp\example.xml", fieldNames)
Ed i suoi risultati finali saranno:
<?xml version="1.0" standalone="yes"?>
<DocumentElement>
<TempTable>
<Id>1</Id>
<Name>John Doe</Name>
<Age>40</Age>
</TempTable>
<TempTable>
<Id>2</Id>
<Name>Mark Nosurname</Name>
<Age>35</Age>
</TempTable>
<TempTable>
<Id>3</Id>
<Name>Jane Doe</Name>
<Age>32</Age>
</TempTable>
<TempTable>
<Id>4</Id>
<Name>Without name</Name>
<Age>60</Age>
</TempTable>
</DocumentElement>