Java lib ou une application pour convertir CSV en fichier XML?

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

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

0
ajouté édité
Vues: 2
Il semble que c'est la première question avec l'étiquette de Java dans SO.
ajouté l'auteur Paul Vargas, source
@ bjb568 Que voulez-vous dire?
ajouté l'auteur CodingNinja, source
@ bjb568 Oh. haha
ajouté l'auteur CodingNinja, source
@Paul Non seulement ça, c'est aussi 123!
ajouté l'auteur bjb568, source
ajouté l'auteur bjb568, source

16 Réponses

Cela peut être trop basique ou limité d'une solution, mais vous ne pourriez pas faire un String.split() sur chaque ligne du fichier, en se souvenant du tableau de résultat de la première ligne pour générer le xml , et crache juste les données de tableau de chaque ligne avec les éléments xml appropriés remplissant chaque itération d'une boucle?

0
ajouté
Pas si votre fichier CSV contient des guillemets dans les données, ce qui est assez courant.
ajouté l'auteur Alan Krueger, source

Je ne comprends pas pourquoi tu voudrais faire ça. Cela ressemble presque à du codage culte.

La conversion d'un fichier CSV en xml n'ajoute aucune valeur. Votre programme lit déjà le fichier CSV, arguant que vous avez besoin de xml ne fonctionne pas.

D'autre part, lire le fichier CSV, faire quelque chose avec les valeurs, puis sérialiser en xml a du sens (bien que l'utilisation de xml puisse avoir du sens ...;)) mais vous aurait soi-disant déjà un moyen de sérialisation au format XML.

0
ajouté

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

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

É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 analyse très simple (ne prenant pas en compte les virgules entre guillemets ou échappées) et ne tient pas compte des éventuelles données manquantes.

0
ajouté
Exercice laissé au lecteur?
ajouté l'auteur Alan Krueger, source
Vous pouvez donc appeler une bibliothèque CSV pour effectuer l'analyse, puis utiliser le générateur de marquage. Peut-être pourriez-vous éditer votre réponse pour montrer cela.
ajouté l'auteur Peter Kelley, source

Maybe this might help: JSefa

Vous pouvez lire le fichier CSV avec cet outil et le sérialiser en XML.

0
ajouté

J'ai un framework opensource pour travailler avec des fichiers CSV et des fichiers plats en général. Peut-être que ça vaut le coup d'être regardé: 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 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;  
}

puis simplement analyser 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'objets analysés.

J'espère que cela pourra aider!

0
ajouté
+1 pour l'utilisation des annotations. Malheureusement, à ce jour, il semble que le projet ne dispose d'aucune nouvelle version depuis le 2009-08-11 ...
ajouté l'auteur Stephan, source
Oui, je n'ai pas eu le temps de continuer le développement depuis, mais c'est très stable.
ajouté l'auteur kolrie, source

Cette solution n'a pas besoin de bibliothèques CSV ou xml et, je sais, elle ne gère pas les caractères illégaux et les problèmes d'encodage, mais elle pourrait aussi vous intéresser, à condition que votre entrée CSV ne brise pas les règles mentionnées ci-dessus.

Attention: You should not use this code unless you know what you do or don't have the chance to use a further library (possible in some bureaucratic projects)... Use a StringBuffer for older Runtime Environments...

Alors on y va:

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(headers.get(count));
            xml.append(">");
            xml.append(lineBreak);
            count++;
        }
        xml.append("\t");
        xml.append(lineBreak);
        entryCount++;
    }
}
xml.append("");
System.out.println(xml.toString());

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

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

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
    

0
ajouté

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

La conversion repose sur la lecture de l'entrée avec backend CSV, l'écriture à l'aide de 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 stricte, car le contenu de CSV peut aussi être lu "non typé" (une séquence de tableaux String ), mais nécessite un peu plus de travail sur la sortie XML.

Pour le côté XML, vous devez disposer d'un objet racine wrapper pour contenir le tableau ou List des objets à sérialiser.

0
ajouté

For the CSV Part, you may use my little open source library

0
ajouté
Avez-vous un autre lien pour votre bibliothèque? Le lien est mort. C'est d'ailleurs la raison exacte pour laquelle les réponses de lien seulement sont désorganisées.
ajouté l'auteur Magnilex, source
Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. - De l'avis
ajouté l'auteur Boo Berr'ita, source

Comme les autres, je ne connais pas de méthode en une seule étape, mais si vous êtes prêt à utiliser des bibliothèques externes très simples, je dirais:

OpenCsv for parsing CSV (small, simple, reliable and easy to use)

Xstream to parse/serialize xml (very very easy to use, and creating fully human readable xml)

En utilisant les mêmes 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(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();
        }
    }
}

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


  
    
      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
    
  

0
ajouté

Pour autant que je sache, il n'existe pas de bibliothèque prête à l'emploi pour vous, mais la création d'un outil capable de traduire CSV en xml ne nécessite que l'écriture d'un analyseur CSV brut et le raccordement de JDOM (ou votre bibliothèque xml Java de choix) avec du code de colle.

0
ajouté

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

  • Un framework d'analyse CSV
  • Un framework de sérialisation xml

L'analyseur CSV que je recommanderais (à moins que vous ne souhaitiez vous amuser un peu à écrire votre propre analyseur CSV) est OpenCSV (Un projet SourceForge pour analyser les données CSV)

Le cadre de sérialisation xml devrait être quelque chose qui peut évoluer au cas où vous voudriez transformer un fichier CSV volumineux (ou énorme) en XML: Ma recommandation est le framework d'analyse xml de Sun Java Streaming (voir ici ) qui permet le pull-parsing ET la sérialisation.

0
ajouté

Il y a aussi une bonne bibliothèque ServingXML par Daniel Parker, qui est capable de convertir presque n'importe quel format de texte brut en xml et de retour .

L'exemple de votre cas peut être trouvé ici : il utilise l'en-tête de champ dans CSV fichier en tant que nom de l'élément XML.

0
ajouté

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

Fondamentalement, la variable de texte sera écrite dans contacts.xml pour chaque ligne du 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 
    <title> ${fields[4]} </title>
     ${fields[3]} 
    """
}
0
ajouté
Le format CSV est simple, mais il n'est généralement jamais assez simple qu'une séparation sur la virgule suffise.
ajouté l'auteur Alan Krueger, source

Vous pouvez utiliser XSLT . Google et vous trouverez quelques exemples par exemple. CSV en xml Si vous utilisez XSLT , vous pouvez convertir le fichier xml au format de votre choix.

0
ajouté

La grande différence est que JSefa fait en sorte qu'il peut sérialiser vos objets Java en CSV / xml / fichiers etc et peut désérialiser en arrière aux objets Java. Et il est piloté par des annotations qui vous donnent beaucoup de contrôle sur la sortie.

JFileHelpers a aussi l'air intéressant.

0
ajouté

J'ai eu le même problème et j'avais besoin d'une application pour convertir un fichier CSV en un fichier xml pour un de mes projets, mais je n'ai rien trouvé de gratuit et assez bon sur le net, j'ai donc codé ma propre application Java Swing CSVtoXML.

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

Sinon, vous pouvez facilement coder les vôtres comme je l'ai fait; Le code source se trouve dans le fichier JAR. Modifiez-le si nécessaire, s'il ne répond pas à vos besoins.

0
ajouté
Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. - De l'avis
ajouté l'auteur Matthew Groves, source