Vă mulțumim pentru susținere

Java lib sau app pentru a converti fișierul CSV în fișierul XML?

Există o aplicație sau o bibliotecă existentă în Java care îmi va permite să convertesc un fișier de date CSV în fișierul XML ?

Tag-urile XML vor fi furnizate prin eventualul prim rând care conține titlurile coloanelor.

0
adăugat editat
Se pare că aceasta este prima întrebare cu eticheta Java în SO.
adăugat autor Paul Vargas
@ bjb568 Ce vrei să spui?
adăugat autor CodingNinja
@ bjb568 Oh. haha
adăugat autor CodingNinja
@Paul Nu numai că, este, de asemenea, 123!
adăugat autor bjb568
adăugat autor bjb568

16 răspunsuri

Aceasta poate fi prea de bază sau limitată de o soluție, dar nu ați putut să faceți o String.split () pe fiecare linie a fișierului, ținând cont de matricea rezultatelor primei linii pentru a genera XML , și scuipă doar datele de pe fiecare linie a matricei cu elementele corespunzătoare XML care împachetează fiecare iterație a unei buclă?

0
adăugat
Nu dacă fișierul dvs. CSV conține vreodată virgule în date, ceea ce este destul de comun.
adăugat autor Alan Krueger

Nu înțeleg de ce ai vrea să faci asta. Sună aproape ca o codificare a cultului de marfă.

Conversia unui fișier CSV în XML nu adaugă nicio valoare. Programul dvs. deja citește fișierul CSV, argumentând astfel că aveți nevoie de XML nu funcționează.

Pe de altă parte, citirea fișierului CSV, a face ceva cu valorile și apoi serializarea la XML are sens (bine, la fel de mult ca și utilizarea XML poate avea sens ...;)) ar fi avut deja un mijloc de serializare la XML.

0
adăugat

Știu că ați cerut Java, dar acest lucru mi se pare o sarcină potrivită limbajului scripting. Aici este o soluție rapidă (foarte simplă) scrisă în 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])
            }
        }
    }
}

Scrie urmatorul XML in 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
  

Cu toate acestea, codul face o analiză foarte simplă (care nu ține cont de virgulele cotate sau scapate) și nu ține seama de posibilele date absente.

0
adăugat
Exercițiu la stânga la cititor?
adăugat autor Alan Krueger
Deci, ați putea apela o bibliotecă CSV pentru a face parsarea și apoi utilizați constructorul de markupuri. Poate că ați putea să vă editați răspunsul pentru a arăta acest lucru.
adăugat autor Peter Kelley

Maybe this might help: JSefa

Puteți citi fișierul CSV cu acest instrument și îl puteți serializa în format XML.

0
adăugat

Am un framework open source pentru lucrul cu CSV și fișierele plate, în general. Poate că merită să te uiți: JFileHelpers .

Cu acest set de instrumente puteți scrie cod folosind fasole, cum ar fi:

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

și apoi analizați doar fișierele text folosind:

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

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

Și veți avea o colecție de obiecte parsate.

Sper că vă ajută!

0
adăugat
+1 pentru utilizarea adnotărilor. Din păcate, de astăzi, se pare că proiectul nu are o nouă versiune din 2009-08-11 ...
adăugat autor Stephan
Da, nu am avut timp pentru a continua dezvoltarea de atunci, dar este foarte stabil.
adăugat autor kolrie

Această soluție nu are nevoie de biblioteci CSV sau XML și, știu, nu rezolvă probleme de coduri și caractere ilegale, dar este posibil să fiți interesat și de aceasta, cu condiția ca intrarea CSV să nu încalce regulile menționate mai sus.

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

Deci, aici mergem:

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

Testul de intrare test.csv (furat de la un alt răspuns de pe această pagină):

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

Rezultatul rezultat:


    
        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
adăugat

Jackson are familia de procesoare backend pentru mai multe formate de date, nu doar JSON. Aceasta include atât XML ( https://github.com/FasterXML/jackson-dataformat-xml) și CSV ( https://github.com/FasterXML/jackson-dataformat-csv/ ).

Conversia s-ar baza pe citirea input-ului cu backend-ul CSV, scriind folosind backend XML. Acest lucru este mai ușor de făcut dacă aveți (sau puteți defini) o înregistrare POJO pentru intrări pe rând (CSV). Aceasta nu este o cerință strictă, deoarece conținutul din CSV poate fi citit și "untyped" (o secvență de String arrays), dar necesită puțin mai multă lucrare asupra ieșirii XML.

Pentru partea XML, ai avea nevoie de un obiect rădăcină de wrap pentru a conține array sau List de obiecte pentru serializare.

0
adăugat

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

0
adăugat
Aveți un alt link pentru biblioteca dvs.? Legătura este moartă. Acesta este modul în care motivul exact pentru care se leagă numai răspunsurile sunt îndeplinite.
adăugat autor Magnilex
În timp ce această legătură poate răspunde la întrebare, este mai bine să includeți aici părțile esențiale ale răspunsului și să furnizați linkul pentru referință. Răspunsurile numai în legătură cu rapoartele pot deveni nevalabile dacă se modifică pagina legată. - Din examinare
adăugat autor Boo Berr'ita

Ca și ceilalți de mai sus, nu cunosc nici un fel de un pas pentru a face acest lucru, dar dacă sunteți gata să folosiți biblioteci externe foarte simple, aș sugera:

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)

Folosind aceleași date de probă ca mai sus, codul ar arăta astfel:

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

Producerea următorului rezultat: (Xstream permite reglarea fină a rezultatului ...)


  
    
      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
adăugat

Din câte știu, nu există o bibliotecă gata făcută pentru a face acest lucru pentru dvs., dar producerea unui instrument capabil să traducă din CSV în XML ar trebui să solicite numai să scrieți un parser CSV brut și să conectați JDOM (sau biblioteca XML Java a alegere) cu un cod de lipici.

0
adăugat

Nu este nimic despre care știu că poate face acest lucru fără dvs. cel puțin scriind un pic de cod ... Veți avea nevoie de 2 biblioteci separate:

  • Un cadru de parser CSV
  • Un cadru de serializare XML

Parserul CSV pe care l-aș recomanda (cu excepția cazului în care doriți să aveți puțină distracție să vă scrieți propriul parser CSV) este OpenCSV (un proiect SourceForge pentru parsarea datelor CSV)

Serializarea XML ar trebui să fie ceva ce poate fi scalabil în cazul în care doriți să transformați un fișier CSV mare (sau imens) în XML: Recomandarea mea este Sun Parser XML XML Streaming (Vezi aici ) care permite trasarea și analiza serializării.

0
adăugat

Există, de asemenea, o bună bibliotecă ServingXML de Daniel Parker, care poate converti aproape orice format de text simplu în XML și înapoi .

Exemplul cazului dvs. poate fi găsit aici : utilizează titlul de câmp în CSV Fișier ca nume de element XML.

0
adăugat
${fields[4]}

Puteți face acest lucru cu ușurință folosind Groovy, iar codul este foarte ușor de citit.

În principiu, variabila text va fi scrisă la contacts.xml pentru fiecare rând din contactData.csv , iar matricea câmpurilor conține fiecare coloană.

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[3]} 
    """
}
0
adăugat
CSV-ul este simplu, dar în general nu este niciodată suficient de simplu încât o ruptură pe virgulă este suficientă.
adăugat autor Alan Krueger

Ai putea folosi XSLT . Google și veți găsi câteva exemple, de ex. CSV în XML Dacă utilizați XSLT , puteți apoi converti XML în orice format doriți.

0
adăugat

Marea diferență este faptul că JSefa aduce este faptul că poate serializa obiectele dvs. de java în CSV / XML / etc fișiere și poate deserialize înapoi la obiecte java. Și este condusă de adnotări care vă oferă mult control asupra producției.

JFileHelpers arată, de asemenea, interesant.

0
adăugat

Am avut aceeași problemă și am nevoie de o aplicație pentru a converti un fișier CSV într-un fișier XML pentru unul dintre proiectele mele, dar nu am găsit nimic liber și suficient de bun pe net, așa că am codificat propria aplicație Java Swing CSVtoXML.

Este disponibil de pe site-ul meu AICI . Sper că vă va ajuta.

Dacă nu, puteți codifica cu ușurință propriul dvs. ca și mine; Codul sursă se află în interiorul fișierului de jar, astfel încât să îl modificați după cum aveți nevoie, dacă nu vă satisface cerințele.

0
adăugat
În timp ce această legătură poate răspunde la întrebare, este mai bine să includeți aici părțile esențiale ale răspunsului și să furnizați linkul pentru referință. Răspunsurile numai în legătură cu rapoartele pot deveni nevalabile dacă se modifică pagina legată. - Din examinare
adăugat autor Matthew Groves