Java lib ou application pour convertir CSV en fichier XML?

Existe-t-il une application ou une bibliothèque existante en Java qui me permettra de convertir un fichier de données CSV fichier XML ?

Les balises XML seraient fournies via éventuellement la première ligne contenant les en-têtes de colonne.

Peut-être que cela pourrait aider: JSefa

Vous pouvez lire un fichier CSV avec cet outil et le sérialiser au format XML.

Comme les autres ci-dessus, je ne connais aucun moyen de faire cela, mais si vous êtes prêt à utiliser des bibliothèques externes très simples, je vous suggérerais:

OpenCsv pour l’parsing CSV (petit, simple, fiable et facile à utiliser)

Xstream pour parsingr / sérialiser XML (très très facile à utiliser et créer des fichiers XML entièrement lisibles par l’homme)

En utilisant les mêmes exemples de données que ci-dessus, le code ressemblerait à ceci:

 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(Ssortingng[] args) { Ssortingng startFile = "./startData.csv"; Ssortingng outFile = "./outData.xml"; try { CSVReader reader = new CSVReader(new FileReader(startFile)); Ssortingng[] line = null; Ssortingng[] 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(); } } } 

Produisant le résultat suivant: (Xstream permet un réglage très fin du résultat ...)

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

Je sais que vous avez demandé Java, mais cela me semble être une tâche bien adaptée à un langage de script. Voici une solution rapide (très simple) écrite en Groovy.

test.csv

 ssortingng,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' atsortingbute entry(id:index+1) { headers.eachWithIndex { heading, i -> // write each heading with associated content "${heading}"(dataRow[i]) } } } } 

Écrit le code XML suivant dans 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   

Cependant, le code effectue une parsing très simple (sans tenir compte des virgules entre guillemets ou échappées) et ne tient pas compte des données éventuellement absentes.

J’ai un framework opensource pour travailler avec des fichiers CSV et des fichiers plats en général. Peut-être que ça vaut la peine de regarder: JFileHelpers .

Avec cette boîte à outils, vous pouvez écrire du code en utilisant des beans, comme:

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

puis parsingz simplement vos fichiers texte en utilisant:

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

Et vous aurez une collection d’objects analysés.

J’espère que cela pourra aider!

Cette solution n’a pas besoin de bibliothèques CSV ou XML et, je le sais, elle ne gère pas les caractères illicites et les problèmes d’encodage, mais vous pouvez également vous y intéresser, à condition que votre entrée CSV n’enfreigne pas les règles susmentionnées.

Attention: Vous ne devriez pas utiliser ce code à moins de savoir ce que vous faites ou de ne pas avoir la possibilité d’utiliser une autre bibliothèque (possible dans certains projets bureaucratiques) … Utilisez un SsortingngBuffer pour les anciens environnements d’exécution …

Alors on y va:

 BufferedReader reader = new BufferedReader(new InputStreamReader( Csv2Xml.class.getResourceAsStream("test.csv"))); SsortingngBuilder xml = new SsortingngBuilder(); Ssortingng lineBreak = System.getProperty("line.separator"); Ssortingng 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) { SsortingngTokenizer tokenizer = new SsortingngTokenizer(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.toSsortingng()); 

L’entrée test.csv (volée d’une autre réponse sur cette page):

 ssortingng,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 

La sortie résultante:

   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   

Je ne comprends pas pourquoi tu voudrais faire ça. Cela ressemble presque au codage culte de la cargaison.

La conversion d’un fichier CSV en XML n’ajoute aucune valeur. Votre programme lit déjà le fichier CSV. Par conséquent, argumenter que vous avez besoin de XML ne fonctionne pas.

D’un autre côté, lire le fichier CSV, faire quelque chose avec les valeurs, puis sérialiser en XML a du sens (bon, autant utiliser XML peut avoir un sens …;)) mais vous auriez déjà un moyen de sérialisation en XML.

La grande différence réside dans le fait que JSefa introduit des objects Java dans des fichiers CSV / XML / etc et peut les désérialiser en objects Java. Et il est piloté par des annotations qui vous donnent beaucoup de contrôle sur la sortie.

JFileHelpers semble également intéressant.

Vous pouvez le faire facilement en utilisant Groovy, et le code est très lisible.

Fondamentalement, la variable de texte sera écrite dans contacts.xml pour chaque ligne de contactData.csv et le tableau de champs contient chaque colonne.

 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]}  """ } 

Vous pouvez utiliser XSLT . Google le trouve et vous trouverez quelques exemples, par exemple CSV vers XML. Si vous utilisez XSLT, vous pouvez ensuite convertir le XML au format de votre choix.

Il existe également une bonne bibliothèque ServingXML de Daniel Parker, capable de convertir presque tous les formats de texte en XML et inversement.

L’exemple de votre cas peut être trouvé ici : Il utilise l’en-tête de champ dans le fichier CSV comme nom d’élément XML.

Autant que je sache, il n’y a pas de bibliothèque prête à l’emploi pour le faire, mais produire un outil capable de traduire de CSV en XML ne devrait vous obliger qu’à écrire un parsingur CSV brut et à connecter JDOM (ou votre bibliothèque Java XML de choix) avec un code de colle.

Il n’y a rien que je sache qui puisse le faire sans au moins écrire un peu de code … Vous aurez besoin de 2 bibliothèques séparées:

  • Un cadre d’parsing CSV
  • Un cadre de sérialisation XML

L’parsingur CSV que je recommanderais (à moins que vous souhaitiez vous amuser à écrire votre propre parsingur CSV) est OpenCSV (un projet SourceForge pour l’parsing des données CSV)

XML Serialization Framework doit évoluer au cas où vous souhaiteriez transformer un fichier CSV volumineux (ou volumineux) en XML: Ma recommandation est l’parsingur syntaxique XML de Sun Java Streaming (voir ici ) qui permet l’parsing ET la sérialisation.

Cela peut être trop simple ou trop limité, mais ne pourriez-vous pas faire un Ssortingng.split() sur chaque ligne du fichier, en vous rappelant le tableau de résultats de la première ligne pour générer le XML et en ne branchant que les données de chaque ligne? avec les éléments XML corrects remplissant chaque itération d’une boucle?

La famille de processeurs Jackson a des backends pour plusieurs formats de données, pas seulement JSON. Cela inclut à la fois les backends XML ( https://github.com/FasterXML/jackson-dataformat-xml ) et CSV ( https://github.com/FasterXML/jackson-dataformat-csv/ ).

La conversion repose sur la lecture des entrées avec le backend CSV, l’écriture à l’aide du backend XML. C’est plus facile à faire si vous avez (ou pouvez définir) un POJO pour les entrées par ligne (CSV). Ce n’est pas une exigence ssortingcte, car le contenu de CSV peut également être lu “sans type” (une séquence de tableaux de Ssortingng ), mais nécessite un peu plus de travail sur la sortie XML.

Côté XML, vous aurez besoin d’un object racine d’encapsuleur pour contenir un tableau ou une List d’objects à sérialiser.

J’ai eu le même problème et j’avais besoin d’une application pour convertir un fichier CSV en fichier XML pour un de mes projets, mais je n’ai rien trouvé de gratuit sur Internet. J’ai donc codé mon application Java Swing CSVtoXML.

Il est disponible sur mon site internet ICI . J’espère que cela vous aidera.

Sinon, vous pouvez facilement coder votre propre comme je l’ai fait; Le code source se trouve dans le fichier jar. Modifiez-le selon vos besoins s’il ne répond pas à vos besoins.

Pour la partie CSV, vous pouvez utiliser ma petite bibliothèque open source