Java lib nebo aplikace pro konverzi CSV k XML souboru?

hlasů
95

Je tam existující aplikace nebo knihovna v jazyce Java , který mi umožní převést CSVdatový soubor do XMLsouboru?

Tyto XMLštítky by být poskytnuty prostřednictvím záhlaví sloupců možná první řádek obsahující.

Položena 01/08/2008 v 17:08
zdroj uživatelem
V jiných jazycích...                            


16 odpovědí

hlasů
60

Možná, že by to mohlo pomoci: JSefa

Můžete si přečíst soubor ve formátu CSV s tímto nástrojem a serializaci do XML.

Odpovězeno 01/08/2008 v 19:51
zdroj uživatelem

hlasů
45

Zatímco ostatní výše, nevím žádnou jednom kroku, jak to udělat, ale pokud jste připraveni k použití velmi jednoduchý externí knihovny, bych doporučil:

OpenCsv pro analýzu CSV (malé, jednoduché, spolehlivé a snadno použitelné)

Xstream analyzovat / serializaci XML (velice snadno ovladatelný, a vytvoření plně lidskou čitelný XML)

Použitím stejné vzorová data jak je uvedeno výše, kód by vypadat následovně:

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();
        }
    }
}

Produkovat následující výsledky: (Xstream umožňuje velmi jemné doladění výsledku ...)

<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>
Odpovězeno 10/09/2008 v 08:06
zdroj uživatelem

hlasů
24

Vím, že jste požádal o Javě, ale to mi připadá jako úkol dobře hodí pro skriptovací jazyk. Zde je rychlý (velmi jednoduché) řešení, napsaný v 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])
            }
        }
    }
}

Píše následující XML na standardní výstup:

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

Kód však dělá velmi jednoduchý rozebrat (nebere v úvahu, citované nebo unikly čárek) a nebere v úvahu možné nepřítomných dat.

Odpovězeno 09/08/2008 v 12:06
zdroj uživatelem

hlasů
17

Mám rámec opensource pro práci s CSV a textových souborů obecně. Možná stojí za to při pohledu: JFileHelpers .

S tímto toolkit můžete psát kód pomocí fazole, jako jsou:

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

a pak už jen analyzovat vaše textové soubory pomocí:

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

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

A budete mít sbírku analyzovaných objektů.

Naděje, která pomáhá!

Odpovězeno 28/09/2008 v 00:43
zdroj uživatelem

hlasů
15

Toto řešení nevyžaduje žádné CSV nebo XML knihovny, a já vím, že nezpracovává žádné nepovolené znaky a problémy kódování, ale možná budete mít zájem o to, jak dobře, pokud váš vstup CSV neporuší výše uvedená pravidla.

Pozor: Neměli byste používat tento kód, pokud víte, co děláte, nebo nemají možnost využít další knihovny (možná v některých byrokratických projektů) ... Použijte StringBuffer pro starší Runtime prostředí ...

Tak jdeme na to:

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());

Vstupní test.csv (ukradené z jiného odpovědi na této stránce):

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

Výsledný výstup:

<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>
Odpovězeno 22/08/2008 v 00:17
zdroj uživatelem

hlasů
14

Velký rozdíl je, že JSefa přináší je, že lze serializovat své java objekty CSV / XML / etc souborů a lze rekonstruovat zpět na java objekty. A to je poháněno anotací, která vám dává hodně kontroly nad výkonem.

JFileHelpers také vypadá zajímavě.

Odpovězeno 11/08/2010 v 06:49
zdroj uživatelem

hlasů
14

To lze provést mimořádně snadno pomocí Groovy, a kód je velmi čitelný.

Zjednodušeně řečeno, bude text proměnná být napsán contacts.xmlpro každý řádek v contactData.csva pole pole obsahuje každý sloupec.

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>"""
}
Odpovězeno 02/10/2008 v 07:08
zdroj uživatelem

hlasů
13

Nechápu, proč byste chtěli udělat. Zní to skoro jako cargo kultu kódování.

Převod souboru CSV na XML nepřidává žádnou hodnotu. Váš program se již čtení souboru CSV, takže argumentovat, že budete potřebovat XML nefunguje.

Na druhou stranu, čtení souboru CSV, dělá něco s hodnotami, a pak serializaci do XML nemá smysl (dobře, stejně jako s využitím XML může mít smysl ...;)), ale bude prý již mít prostředky serializaci do XML.

Odpovězeno 01/08/2008 v 20:21
zdroj uživatelem

hlasů
11

Dalo by se použít XSLT . Google ji a najdete několik příkladů, například ve formátu CSV do XML Pokud používáte XSLT pak můžete převést do XML bez ohledu na formát chcete.

Odpovězeno 16/10/2008 v 15:33
zdroj uživatelem

hlasů
8

K dispozici je také dobrá knihovna ServingXML Daniel Parker, který je schopen převést téměř jakékoliv formátu prostého textu do XML a zpět.

Příklad pro váš případ lze nalézt zde : Používá záhlaví pole v souboru CSV jako název prvku XML.

Odpovězeno 30/09/2008 v 22:22
zdroj uživatelem

hlasů
7

Neexistuje nic, co vím, že to může udělat, aniž byste alespoň psaní trochu kódu ... Budete potřebovat 2 samostatná knihovna:

  • Rámec CSV analyzátor
  • Rámec XML Serializace

CSV parser bych doporučil (pokud chcete mít trochu zábavy psát svůj vlastní CSV analyzátor) je OpenCSV (A SourceForge Project pro analýzu dat ve formátu CSV)

Serializace Framework XML by mělo být něco, co lze škálovat v případě, že chcete transformovat velké (nebo velký) CSV soubor XML: Mé doporučení je Sun Java Streaming XML Parser Framework (viz zde ), který umožňuje vytažení analýzu a serializaci.

Odpovězeno 04/08/2008 v 02:07
zdroj uživatelem

hlasů
7

Pokud je mi známo, není hotové knihovny, aby to pro vás, ale vytváří nástroj, který je schopen překládat z CSV na XML by mělo pouze vyžadovat, abyste napsat surový CSV parser a připojit JDOM (nebo XML Java knihovnu volba) s nějakým lepidlem kódem.

Odpovězeno 02/08/2008 v 20:06
zdroj uživatelem

hlasů
4

Jackson Rodina procesorů má backends pro více datových formátů, nejen JSON. To zahrnuje jak XML ( https://github.com/FasterXML/jackson-dataformat-xml ) a CSV ( https://github.com/FasterXML/jackson-dataformat-csv/ ) backends.

Konverze by se spoléhají na čtení vstup s CSV backend, psát pomocí XML backend. To je nejjednodušší udělat, pokud máte (nebo lze definovat) na POJO pro per-řádek (CSV) položky. Nejedná se o striktní požadavek, protože obsah z CSV může být čten „bez typu“ stejně (posloupnost Stringpolí), ale vyžaduje sice pracnější na výstupu XML.

U boku XML, budete muset kořenový objekt obálky tak, aby obsahoval pole nebo Listobjekty serializovat.

Odpovězeno 29/04/2015 v 20:01
zdroj uživatelem

hlasů
3

Měl jsem stejný problém a potřeboval žádost o převod souboru CSV do XML souboru pro jeden z mých projektů, ale nenašel nic, volný a dostatečně dobře na netu, tak jsem kódované svůj vlastní Java Swing CSVtoXML aplikace.

Je k dispozici od mých webových stránkách ZDE . Doufám, že to pomůže.

Pokud tomu tak není, můžete snadno kódovat svůj vlastní stejně jako já; Zdrojový kód je uvnitř, takže soubor jar modifikovat, jak budete potřebovat, pokud nevyplní svůj požadavek.

Odpovězeno 16/04/2014 v 01:12
zdroj uživatelem

hlasů
3

Pro CSV části, můžete použít můj malý open source knihovnu

Odpovězeno 16/09/2008 v 17:07
zdroj uživatelem

hlasů
3

To může být příliš základní nebo omezeno na řešení, ale nemohli byste udělat String.split()na každém řádku souboru, vzpomněl si na výsledek pole v prvním řádku ke generování XML, a jen plivat dat pole každého řádku je venku s řádným XML prvky polstrování každém opakování smyčky?

Odpovězeno 01/08/2008 v 17:31
zdroj uživatelem

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