Lib Java o app per convertire CSV in file XML?

Esiste un’applicazione o una libreria esistente in Java che mi consenta di convertire un file di dati CSV un file XML ?

I tag XML verrebbero forniti attraverso possibilmente la prima riga contenente le intestazioni di colonna.

Forse questo potrebbe aiutare: JSefa

Puoi leggere il file CSV con questo strumento e serializzarlo in XML.

Come gli altri sopra, non conosco alcun modo per farlo, ma se sei pronto per usare librerie esterne molto semplici, ti suggerirei:

OpenCsv per l’analisi di CSV (piccolo, semplice, affidabile e facile da usare)

Xstream per analizzare / serializzare XML (molto molto facile da usare e creare xml completamente leggibile)

Usando gli stessi dati di esempio come sopra, il codice sarà simile a:

 package fr.megiste.test; import java.io.FileReader; import java.io.FileWriter; import java.util.ArrayList; import java.util.List; import au.com.bytecode.opencsv.CSVReader; import com.thoughtworks.xstream.XStream; public class CsvToXml { public static void main(String[] args) { String startFile = "./startData.csv"; String outFile = "./outData.xml"; try { CSVReader reader = new CSVReader(new FileReader(startFile)); String[] line = null; String[] header = reader.readNext(); List out = new ArrayList(); while((line = reader.readNext())!=null){ List item = new ArrayList(); for (int i = 0; i < header.length; i++) { String[] keyVal = new String[2]; String string = header[i]; String val = line[i]; keyVal[0] = string; keyVal[1] = val; item.add(keyVal); } out.add(item); } XStream xstream = new XStream(); xstream.toXML(out, new FileWriter(outFile,false)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 

Produrre il seguente risultato: (Xstream consente una sintonizzazione molto precisa del risultato ...)

    string hello world   float1 1.0   float2 3.3   integer 4     string goodbye world   float1 1e9   float2 -3.3   integer 45     string hello again   float1 -1   float2 23.33   integer 456     string hello world 3   float1 1.40   float2 34.83   integer 4999     string hello 2 world   float1 9981.05   float2 43.33   integer 444    

So che hai chiesto Java, ma questo mi sembra un compito adatto a un linguaggio di scripting. Ecco una soluzione rapida (molto semplice) scritta in Groovy.

test.csv

 string,float1,float2,integer hello world,1.0,3.3,4 goodbye world,1e9,-3.3,45 hello again,-1,23.33,456 hello world 3,1.40,34.83,4999 hello 2 world,9981.05,43.33,444 

csvtoxml.groovy

 #!/usr/bin/env groovy def csvdata = [] new File("test.csv").eachLine { line -> csvdata < < line.split(',') } def headers = csvdata[0] def dataRows = csvdata[1..-1] def xml = new groovy.xml.MarkupBuilder() // write 'root' element xml.root { dataRows.eachWithIndex { dataRow, index -> // write 'entry' element with 'id' attribute entry(id:index+1) { headers.eachWithIndex { heading, i -> // write each heading with associated content "${heading}"(dataRow[i]) } } } } 

Scrive il seguente codice XML sullo stdout:

   hello world 1.0 3.3 4   goodbye world 1e9 -3.3 45   hello again -1 23.33 456   hello world 3 1.40 34.83 4999   hello 2 world 9981.05 43.33 444   

Tuttavia, il codice esegue un’analisi molto semplice (senza prendere in considerazione virgolette o virgolette di escape) e non tiene conto dei possibili dati di assenza.

Ho un framework opensource per lavorare con CSV e file flat in generale. Forse vale la pena guardare: JFileHelpers .

Con quel toolkit puoi scrivere codice usando bean, come:

 @FixedLengthRecord() public class Customer { @FieldFixedLength(4) public Integer custId; @FieldAlign(alignMode=AlignMode.Right) @FieldFixedLength(20) public String name; @FieldFixedLength(3) public Integer rating; @FieldTrim(trimMode=TrimMode.Right) @FieldFixedLength(10) @FieldConverter(converter = ConverterKind.Date, format = "dd-MM-yyyy") public Date addedDate; @FieldFixedLength(3) @FieldOptional public String stockSimbol; } 

e quindi basta analizzare i file di testo usando:

 FileHelperEngine engine = new FileHelperEngine(Customer.class); List customers = new ArrayList(); customers = engine.readResource( "/samples/customers-fixed.txt"); 

E avrai una collezione di oggetti analizzati.

Spero possa aiutare!

Questa soluzione non ha bisogno di librerie CSV o XML e, lo so, non gestisce i caratteri illegali e problemi di codifica, ma potrebbe esserti interessato anche se il tuo input CSV non infrange le regole sopra citate.

Attenzione: non dovresti usare questo codice se non sai cosa fai o non hai la possibilità di usare un’ulteriore libreria (ansible in alcuni progetti burocratici) … Usa un StringBuffer per ambienti Runtime più vecchi …

Quindi eccoci qui:

 BufferedReader reader = new BufferedReader(new InputStreamReader( Csv2Xml.class.getResourceAsStream("test.csv"))); StringBuilder xml = new StringBuilder(); String lineBreak = System.getProperty("line.separator"); String line = null; List headers = new ArrayList(); boolean isHeader = true; int count = 0; int entryCount = 1; xml.append(""); xml.append(lineBreak); while ((line = reader.readLine()) != null) { StringTokenizer tokenizer = new StringTokenizer(line, ","); if (isHeader) { isHeader = false; while (tokenizer.hasMoreTokens()) { headers.add(tokenizer.nextToken()); } } else { count = 0; xml.append("\t"); xml.append(lineBreak); while (tokenizer.hasMoreTokens()) { xml.append("\t\t< "); xml.append(headers.get(count)); xml.append(">"); xml.append(tokenizer.nextToken()); xml.append(""); xml.append(lineBreak); count++; } xml.append("\t"); xml.append(lineBreak); entryCount++; } } xml.append(""); System.out.println(xml.toString()); 

L’input test.csv (rubato da un’altra risposta in questa pagina):

 string,float1,float2,integer hello world,1.0,3.3,4 goodbye world,1e9,-3.3,45 hello again,-1,23.33,456 hello world 3,1.40,34.83,4999 hello 2 world,9981.05,43.33,444 

L’output risultante:

   hello world 1.0 3.3 4   goodbye world 1e9 -3.3 45   hello again -1 23.33 456   hello world 3 1.40 34.83 4999   hello 2 world 9981.05 43.33 444   

Non capisco perché vorresti farlo. Sembra quasi una codifica del culto del carico.

La conversione di un file CSV in XML non aggiunge alcun valore. Il tuo programma sta già leggendo il file CSV, quindi sostenendo che hai bisogno di XML non funziona.

D’altra parte, leggere il file CSV, fare qualcosa con i valori e quindi serializzare in XML ha senso (beh, tanto quanto usare l’XML può avere senso …;)) ma si suppone che abbia già un mezzo per serializzazione in XML.

La grande differenza è che JSefa introduce è che può serializzare i tuoi oggetti java in file CSV / XML / etc e può deserializzare di nuovo agli oggetti java. Ed è guidato da annotazioni che ti danno molto controllo sull’output.

Anche JFileHelpers sembra interessante.

Puoi farlo eccezionalmente facilmente usando Groovy, e il codice è molto leggibile.

In sostanza, la variabile di testo verrà scritta in contacts.xml per ogni riga in contactData.csv e l’array di campi contiene ciascuna colonna.

 def file1 = new File('c:\\temp\\ContactData.csv') def file2 = new File('c:\\temp\\contacts.xml') def reader = new FileReader(file1) def writer = new FileWriter(file2) reader.transformLine(writer) { line -> fields = line.split(',') text = """  ${fields[2]}   ${fields[1]}   ${fields[9]}   password   ${fields[4]}   ${fields[3]}  """ } 

Potresti usare XSLT . Google e troverai alcuni esempi, ad esempio CSV in XML Se utilizzi XSLT , puoi convertire l’XML in qualsiasi formato desideri.

C’è anche una buona libreria ServingXML di Daniel Parker, che è in grado di convertire quasi tutti i formati di testo normale in XML e viceversa .

L’esempio per il tuo caso può essere trovato qui : utilizza l’intestazione del campo nel file CSV come nome dell’elemento XML.

Per quanto ne so, non esiste una libreria pronta per farlo, ma produrre uno strumento in grado di tradurre da CSV in XML dovrebbe solo richiedere di scrivere un parser CSV grezzo e colbind JDOM (o la tua libreria XML Java di scelta) con un po ‘di codice di colla.

Non c’è nulla che io sappia che possa farlo senza aver almeno scritto un po ‘di codice … Avrai bisogno di 2 librerie separate:

  • Un framework Parser CSV
  • Un framework di serializzazione XML

Il parser CSV che consiglierei (a meno che tu non voglia divertirti un po ‘a scrivere il tuo CSV Parser) è OpenCSV (un progetto SourceForge per analizzare i dati CSV)

Il Serialization Framework XML dovrebbe essere qualcosa che può essere scalato nel caso in cui si desideri convertire file CSV di grandi dimensioni (o enormi) in XML: la mia raccomandazione è Sun Parser XML di Java Java Streaming (vedi qui ) che consente la serializzazione e il pull-parsing.

Questo potrebbe essere troppo semplice o limitato a una soluzione, ma non è ansible eseguire uno String.split() su ogni riga del file, ricordando l’array di risultati della prima riga per generare l’XML e sputare solo i dati dell’array di ogni riga con gli elementi XML corretti che riempiono ogni iterazione di un ciclo?

La famiglia di processori Jackson ha backend per formati di dati multipli, non solo JSON. Ciò include sia backend XML ( https://github.com/FasterXML/jackson-dataformat-xml ) che CSV ( https://github.com/FasterXML/jackson-dataformat-csv/ ).

La conversione farebbe affidamento sull’input di lettura con backend CSV, scrivere usando il backend XML. Questo è più facile da fare se si ha (o si può definire) un POJO per le voci per riga (CSV). Questo non è un requisito rigoroso, in quanto il contenuto di CSV può anche essere letto “non tipizzato” (una sequenza di array di String ), ma richiede un po ‘più di lavoro sull’output XML.

Per il lato XML, è necessario un object radice wrapper per contenere un array o un List di oggetti da serializzare.

Ho avuto lo stesso problema e avevo bisogno di un’applicazione per convertire un file CSV in un file XML per uno dei miei progetti, ma non ho trovato nulla di gratuito e abbastanza buono sulla rete, quindi ho codificato la mia applicazione CSVtoXML Java Swing.

È disponibile dal mio sito QUI . Spero ti possa aiutare.

In caso contrario, puoi facilmente codificare il tuo come l’ho fatto io; Il codice sorgente si trova all’interno del file jar, quindi modificalo come necessario se non soddisfa i tuoi requisiti.

Per la parte CSV, puoi usare la mia piccola libreria open source