Condividi tramite


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>

Codice sorgente

Bibliografia