Java lib of app naar CSV converteren naar XML-bestand?

stemmen
95

Is er een bestaande applicatie of bibliotheek in Java , die me zal toestaan om te zetten van een CSVdata-bestand naar XMLbestand?

De XMLlabels worden verschaft door eventueel de eerste rij met kolomkoppen.

De vraag is gesteld op 01/08/2008 om 17:08
bron van user
In andere talen...                            


16 antwoorden

stemmen
3

Dit kan te basic of beperkt van een oplossing zijn, maar je kon niet een String.split()op elke regel van het bestand, het onthouden van de resultaat matrix van de eerste lijn naar de XML te genereren, en net spit iedere lijn-array data uit met de juiste XML elementen opvullen elke iteratie van een lus?

antwoordde op 01/08/2008 om 17:31
bron van user

stemmen
60

Misschien kan dit helpen: JSefa

U kunt een CSV-bestand te lezen met deze tool en serialize naar XML.

antwoordde op 01/08/2008 om 19:51
bron van user

stemmen
13

Ik begrijp niet waarom je zou willen om dit te doen. Het klinkt bijna als cargo cult codering.

Het omzetten van een CSV-bestand naar XML heeft geen toegevoegde waarde. Het programma is al het lezen van het CSV-bestand, zodat het argument dat je nodig hebt XML werkt niet.

Aan de andere kant, het lezen van het CSV-bestand, doet iets met de waarden en vervolgens serialisatiepakket naar XML wel zinvol (nou ja, zoveel als met behulp van XML kan zinvol zijn ...;)), maar zou je vermoedelijk al een middel serialiseren naar XML.

antwoordde op 01/08/2008 om 20:21
bron van user

stemmen
7

Voor zover ik weet, is er geen kant-en-klare bibliotheek om dit te doen voor u, maar het produceren van een instrument waarmee het vertalen van CSV naar XML mag alleen moet u een ruwe CSV-parser te schrijven en hook up JDOM (of uw XML Java-bibliotheek van keuze) met een aantal glue code.

antwoordde op 02/08/2008 om 20:06
bron van user

stemmen
7

Er is niets dat ik weet dat kan dit doen zonder dat je op zijn minst het schrijven van een beetje van code ... Er zijn 2 aparte bibliotheek nodig:

  • Een CSV Parser Framework
  • Een XML serialisatie Framework

Het CSV-parser ik zou aanraden (tenzij je een beetje leuk om je eigen CSV-parser te schrijven) is OpenCSV (A SourceForge Project voor het ontleden van CSV Data)

Mijn aanbeveling is de Sun Java Streaming XML Parser Framework (Zie: De XML Serialization kader moet iets dat kan schalen in het geval dat u wilt grote (of grote) CSV-bestand om te zetten naar XML zijn hier ) die het mogelijk maakt pull-parsing en serialisatie.

antwoordde op 04/08/2008 om 02:07
bron van user

stemmen
24

Ik weet dat je vroeg voor Java, maar dit lijkt mij een taak goed geschikt voor een scripttaal. Hier is een snelle (zeer eenvoudige) oplossing geschreven 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])
            }
        }
    }
}

Schrijft het volgende XML naar stdout:

<root>
  <entry id='1'>
    <string>hello world</string>
    <float1>1.0</float1>
    <float2>3.3</float2>
    <integer>4</integer>
  </entry>
  <entry id='2'>
    <string>goodbye world</string>
    <float1>1e9</float1>
    <float2>-3.3</float2>
    <integer>45</integer>
  </entry>
  <entry id='3'>
    <string>hello again</string>
    <float1>-1</float1>
    <float2>23.33</float2>
    <integer>456</integer>
  </entry>
  <entry id='4'>
    <string>hello world 3</string>
    <float1>1.40</float1>
    <float2>34.83</float2>
    <integer>4999</integer>
  </entry>
  <entry id='5'>
    <string>hello 2 world</string>
    <float1>9981.05</float1>
    <float2>43.33</float2>
    <integer>444</integer>
  </entry>
</root>

Echter, de code doet het erg eenvoudig parsing (zonder rekening te houden genoteerd of ontsnapte komma's) en het houdt geen rekening met mogelijke afwezig data.

antwoordde op 09/08/2008 om 12:06
bron van user

stemmen
15

Deze oplossing heeft geen CSV of XML bibliotheken nodig hebben en, ik weet het, het geen ongeldige tekens en codering kwesties aan te pakken, maar je misschien wel geïnteresseerd in het zijn zo goed, op voorwaarde dat uw CSV invoer niet de hierboven genoemde regels overtreden.

Let op: U moet deze code niet gebruiken, tenzij je weet wat je wel en niet de kans om een verdere bibliotheek (mogelijk in sommige bureaucratische projecten) geen ... Gebruik een StringBuffer voor oudere Runtime Omgevingen ...

Hier gaan we:

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<String> headers = new ArrayList<String>();
boolean isHeader = true;
int count = 0;
int entryCount = 1;
xml.append("<root>");
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<entry id=\"");
        xml.append(entryCount);
        xml.append("\">");
        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</entry>");
        xml.append(lineBreak);
        entryCount++;
    }
}
xml.append("</root>");
System.out.println(xml.toString());

De input test.csv (gestolen uit een ander antwoord op deze 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

De resulterende output:

<root>
    <entry id="1">
        <string>hello world</string>
        <float1>1.0</float1>
        <float2>3.3</float2>
        <integer>4</integer>
    </entry>
    <entry id="2">
        <string>goodbye world</string>
        <float1>1e9</float1>
        <float2>-3.3</float2>
        <integer>45</integer>
    </entry>
    <entry id="3">
        <string>hello again</string>
        <float1>-1</float1>
        <float2>23.33</float2>
        <integer>456</integer>
    </entry>
    <entry id="4">
        <string>hello world 3</string>
        <float1>1.40</float1>
        <float2>34.83</float2>
        <integer>4999</integer>
    </entry>
    <entry id="5">
        <string>hello 2 world</string>
        <float1>9981.05</float1>
        <float2>43.33</float2>
        <integer>444</integer>
    </entry>
</root>
antwoordde op 22/08/2008 om 00:17
bron van user

stemmen
45

Als de anderen hierboven, ik weet niet één-stap manier om dat te doen, maar als je klaar bent om heel eenvoudig externe bibliotheken gebruiken, zou ik willen voorstellen:

OpenCsv voor parsing CSV (klein, eenvoudig, betrouwbaar en makkelijk te gebruiken)

XStream ontleden / serialize XML (heel erg makkelijk te gebruiken, en het creëren van een volledig menselijk leesbaar xml)

Met behulp van hetzelfde monster als hierboven, zou er als volgt uitzien:

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<String[]> item = new ArrayList<String[]>();
                    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();
        }
    }
}

Het produceren van het volgende resultaat: (Xstream maakt zeer fijnafstelling van het resultaat ...)

<list>
  <list>
    <string-array>
      <string>string</string>
      <string>hello world</string>
    </string-array>
    <string-array>
      <string>float1</string>
      <string>1.0</string>
    </string-array>
    <string-array>
      <string>float2</string>
      <string>3.3</string>
    </string-array>
    <string-array>
      <string>integer</string>
      <string>4</string>
    </string-array>
  </list>
  <list>
    <string-array>
      <string>string</string>
      <string>goodbye world</string>
    </string-array>
    <string-array>
      <string>float1</string>
      <string>1e9</string>
    </string-array>
    <string-array>
      <string>float2</string>
      <string>-3.3</string>
    </string-array>
    <string-array>
      <string>integer</string>
      <string>45</string>
    </string-array>
  </list>
  <list>
    <string-array>
      <string>string</string>
      <string>hello again</string>
    </string-array>
    <string-array>
      <string>float1</string>
      <string>-1</string>
    </string-array>
    <string-array>
      <string>float2</string>
      <string>23.33</string>
    </string-array>
    <string-array>
      <string>integer</string>
      <string>456</string>
    </string-array>
  </list>
  <list>
    <string-array>
      <string>string</string>
      <string>hello world 3</string>
    </string-array>
    <string-array>
      <string>float1</string>
      <string>1.40</string>
    </string-array>
    <string-array>
      <string>float2</string>
      <string>34.83</string>
    </string-array>
    <string-array>
      <string>integer</string>
      <string>4999</string>
    </string-array>
  </list>
  <list>
    <string-array>
      <string>string</string>
      <string>hello 2 world</string>
    </string-array>
    <string-array>
      <string>float1</string>
      <string>9981.05</string>
    </string-array>
    <string-array>
      <string>float2</string>
      <string>43.33</string>
    </string-array>
    <string-array>
      <string>integer</string>
      <string>444</string>
    </string-array>
  </list>
</list>
antwoordde op 10/09/2008 om 08:06
bron van user

stemmen
3

Voor de CSV deel, kunt u gebruik maken van mijn kleine open source library

antwoordde op 16/09/2008 om 17:07
bron van user

stemmen
17

Ik heb een open source framework voor het werken met CSV en een flatscreen-bestanden in het algemeen. Misschien is het de moeite waard: JFileHelpers .

Met dat toolkit kunt u code schrijven met behulp van bonen, zoals:

@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;  
}

en dan gewoon ontleden uw tekst bestanden met behulp van:

FileHelperEngine<Customer> engine = 
    new FileHelperEngine<Customer>(Customer.class); 
List<Customer> customers = 
    new ArrayList<Customer>();

customers = engine.readResource(
    "/samples/customers-fixed.txt");

En vind je een verzameling van ontleed objecten.

Hoop dat het helpt!

antwoordde op 28/09/2008 om 00:43
bron van user

stemmen
8

Er is ook een goede bibliotheek ServingXML door Daniel Parker, die in staat is om bijna elke platte tekst om te zetten naar XML en terug.

Het voorbeeld voor uw zaak kan worden gevonden hier : Het maakt gebruik van kop van het veld in het CSV-bestand als de naam XML-element.

antwoordde op 30/09/2008 om 22:22
bron van user

stemmen
14

U kunt dit doen uitzonderlijk gemakkelijk met behulp van Groovy, en de code is zeer leesbaar.

In principe zal de tekstvariabele worden geschreven contacts.xmlvoor elke lijn in contactData.csv, en de velden array elke kolom.

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 = """<CLIENTS>
    <firstname> ${fields[2]} </firstname>
    <surname> ${fields[1]} </surname>
    <email> ${fields[9]} </email>
    <employeenumber> password </employeenumber>
    <title> ${fields[4]} </title>
    <phone> ${fields[3]} </phone>
    </CLIENTS>"""
}
antwoordde op 02/10/2008 om 07:08
bron van user

stemmen
11

Je zou kunnen gebruiken XSLT . Google het en je zal het vinden van een paar voorbeelden, bijvoorbeeld CSV naar XML Als u XSLT kunt u vervolgens omzetten van de XML naar welk formaat je wilt.

antwoordde op 16/10/2008 om 15:33
bron van user

stemmen
14

Het grote verschil is dat JSefa brengt is dat het je java objecten kunnen serialiseren naar CSV / XML / etc bestanden en kan terug deserialize naar Java-objecten. En het is gedreven door de aantekeningen die veel controle geeft over de output.

JFileHelpers ziet er ook interessant.

antwoordde op 11/08/2010 om 06:49
bron van user

stemmen
3

Ik had het zelfde probleem en een applicatie naar een CSV-bestand te converteren naar een XML-bestand voor één van mijn projecten nodig is, maar vond niets gratis en goed genoeg op het net niet vinden, dus ik gecodeerde mijn eigen Java Swing CSVtoXML applicatie.

Het is beschikbaar op mijn website HIER . Hoop dat het zal je helpen.

Zo niet, dan kunt u gemakkelijk coderen uw eigen zoals ik deed; De broncode is in de pot bestand, zodat wijzigen als je nodig hebt als het niet uw eis vult.

antwoordde op 16/04/2014 om 01:12
bron van user

stemmen
4

Jackson processor familie heeft backends voor meerdere dataformaten, niet alleen JSON. Dit omvat zowel XML ( https://github.com/FasterXML/jackson-dataformat-xml ) en CSV ( https://github.com/FasterXML/jackson-dataformat-csv/ ) backends.

Conversie zou vertrouwen op het lezen ingang met CSV backend, schrijven met behulp van XML backend. Dit is het gemakkelijkst te doen als u (of kan definiëren) een POJO gegevens per rij (CSV) inzendingen. Dit is niet een strikte vereiste, als de inhoud van CSV kan worden gelezen "zonder type" ook (een opeenvolging van Stringarrays), maar vereist wat meer werk op XML-uitvoer.

Voor XML kant, zou je een wrapper hoofdobject array bevatten of nodig hebben Listvan voorwerpen serialize.

antwoordde op 29/04/2015 om 20:01
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more