Java lib ή την εφαρμογή για τη μετατροπή CSV αρχείο XML;

ψήφοι
95

Είναι μια υπάρχουσα εφαρμογή ή βιβλιοθήκη εκεί Java που θα μου επιτρέψει να μετατρέψετε ένα CSVαρχείο δεδομένων σε XMLαρχείο;

Οι XMLετικέτες θα πρέπει να παρέχονται μέσω επικεφαλίδες στήλης ίσως η πρώτη σειρά που περιέχει.

Δημοσιεύθηκε 01/08/2008 στις 17:08
πηγή χρήστη
Σε άλλες γλώσσες...                            


16 απαντήσεις

ψήφοι
60

Ίσως αυτό θα μπορούσε να βοηθήσει: JSefa

Μπορείτε να διαβάσετε το αρχείο CSV με αυτό το εργαλείο και συνέχειες να XML.

Απαντήθηκε 01/08/2008 στις 19:51
πηγή χρήστη

ψήφοι
45

Καθώς τα πάνω από τους άλλους, δεν ξέρω καμία ένα βήμα τρόπος για να το κάνουμε αυτό, αλλά αν είστε έτοιμοι να χρησιμοποιήσετε το πολύ απλό εξωτερικές βιβλιοθήκες, θα ήθελα να προτείνω:

OpenCsv για την ανάλυση CSV (μικρό, απλό, αξιόπιστο και εύκολο στη χρήση)

Xstream να αναλύσει / σειριοποίηση XML (πολύ πολύ εύκολο στη χρήση, και τη δημιουργία πλήρως ανθρώπινα αναγνώσιμες XML)

Χρησιμοποιώντας τα ίδια δεδομένα δείγματος όπως παραπάνω, ο κώδικας θα μοιάζουν:

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

Η παραγωγή το ακόλουθο αποτέλεσμα: (Xstream επιτρέπει πολύ λεπτή ρύθμιση του αποτελέσματος ...)

<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>
Απαντήθηκε 10/09/2008 στις 08:06
πηγή χρήστη

ψήφοι
24

Ξέρω ότι ζήτησε Java, αλλά αυτό μου φαίνεται σαν ένα έργο κατάλληλο για μια scripting γλώσσα. Εδώ είναι μια γρήγορη (πολύ απλή) λύση γραμμένο σε 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])
            }
        }
    }
}

Γράφει τα εξής XML στο 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>

Ωστόσο, ο κώδικας κάνει πολύ απλό parsing (χωρίς να λαμβάνεται υπόψη είναι εισηγμένες ή διέφυγαν κόμματα) και δεν ευθύνονται για πιθανές απουσιάζει δεδομένων.

Απαντήθηκε 09/08/2008 στις 12:06
πηγή χρήστη

ψήφοι
17

Έχω ένα πλαίσιο ανοιχτού κώδικα για την εργασία με CSV και επίπεδη αρχεία σε γενικές γραμμές. Ίσως αξίζει να ψάχνει: JFileHelpers .

Με αυτή την εργαλειοθήκη μπορείτε να γράψετε κώδικα χρησιμοποιώντας τα φασόλια, όπως:

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

και στη συνέχεια, μόλις αναλύσει τα αρχεία κειμένου σας με τη χρήση:

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

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

Και θα έχετε μια συλλογή από αναλυθεί αντικείμενα.

Ελπίδα που βοηθά!

Απαντήθηκε 28/09/2008 στις 00:43
πηγή χρήστη

ψήφοι
15

Η λύση αυτή δεν χρειάζεται καμία CSV ή XML βιβλιοθήκες και, ξέρω, ότι δεν χειρίζεται καμία παράνομη χαρακτήρες και θέματα κωδικοποίησης, αλλά μπορεί να σας ενδιαφέρει σε αυτό, καθώς, με την προϋπόθεση εισόδου σας CSV δεν σπάσει τους παραπάνω κανόνες.

Προσοχή: Δεν πρέπει να χρησιμοποιήσετε αυτόν τον κωδικό αν δεν ξέρετε τι κάνετε ή δεν έχουν την ευκαιρία να χρησιμοποιήσει ένα επιπλέον βιβλιοθήκης (ενδεχομένως σε ορισμένες γραφειοκρατικές έργα) ... Χρησιμοποιήστε ένα StringBuffer για τους ηλικιωμένους περιβάλλοντα χρόνου εκτέλεσης ...

Έτσι, εδώ πηγαίνουμε:

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

Η 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

Η προκύπτουσα έξοδος:

<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>
Απαντήθηκε 22/08/2008 στις 00:17
πηγή χρήστη

ψήφοι
14

Η μεγάλη διαφορά είναι ότι JSefa φέρνει είναι ότι μπορεί να σε συνέχειες αντικείμενα java σας για να CSV / XML / etc αρχεία και να αποσειριοποίηση πίσω σε αντικείμενα java. Και αυτό είναι καθοδηγείται από τα σχόλια που σας δίνει πολλά έλεγχο της εξόδου.

JFileHelpers φαίνεται επίσης ενδιαφέρον.

Απαντήθηκε 11/08/2010 στις 06:49
πηγή χρήστη

ψήφοι
14

Μπορείτε να το κάνετε αυτό εξαιρετικά εύκολα χρησιμοποιώντας Groovy, και ο κώδικας είναι πολύ ευανάγνωστη.

Βασικά, η μεταβλητή κείμενο θα γραφτεί να contacts.xmlγια κάθε γραμμή στο contactData.csv, και η συστοιχία πεδία περιέχει κάθε στήλη.

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>"""
}
Απαντήθηκε 02/10/2008 στις 07:08
πηγή χρήστη

ψήφοι
13

Δεν καταλαβαίνω γιατί θα θέλετε να το κάνετε αυτό. Ακούγεται σχεδόν σαν κωδικοποίηση λατρεία του φορτίου.

Μετατρέποντας ένα αρχείο CSV σε XML δεν προσθέτει καμία αξία. Το πρόγραμμά σας είναι ήδη ανάγνωση του αρχείου CSV, έτσι το επιχείρημα ότι θα πρέπει XML δεν λειτουργεί.

Από την άλλη πλευρά, την ανάγνωση του αρχείου CSV, να κάνει κάτι με τις τιμές, και στη συνέχεια συνέχειες σε XML έχει νόημα (και, όσο με τη χρήση XML μπορεί να έχει νόημα ...?)), Αλλά υποτίθεται ότι θα είχε ήδη ένα μέσο συνέχειες σε XML.

Απαντήθηκε 01/08/2008 στις 20:21
πηγή χρήστη

ψήφοι
11

Θα μπορούσατε να χρησιμοποιήσετε XSLT . Το Google και θα βρείτε μερικά παραδείγματα π.χ. CSV σε XML Εάν χρησιμοποιείτε XSLT μπορείτε στη συνέχεια να μετατρέψετε το XML σε ό, τι σχήμα θέλετε.

Απαντήθηκε 16/10/2008 στις 15:33
πηγή χρήστη

ψήφοι
8

Υπάρχει επίσης καλή βιβλιοθήκη ServingXML από τον Daniel Parker, η οποία είναι σε θέση να μετατρέψει σχεδόν οποιαδήποτε μορφή απλού κειμένου σε XML και πίσω.

Το παράδειγμα για την περίπτωσή σας μπορείτε να βρείτε εδώ : Χρησιμοποιεί τίτλος του πεδίου στο αρχείο CSV με το όνομα του στοιχείου XML.

Απαντήθηκε 30/09/2008 στις 22:22
πηγή χρήστη

ψήφοι
7

Δεν υπάρχει τίποτα που ξέρω ότι μπορεί να γίνει αυτό χωρίς να έχετε τουλάχιστον γράφει ένα μικρό κομμάτι του κώδικα ... Θα χρειαστείτε 2 ξεχωριστά βιβλιοθήκης:

  • Πλαίσιο CSV Parser
  • Ένα πλαίσιο XML Serialization

Το πρόγραμμα ανάλυσης CSV θα ήθελα να συστήσω (εκτός αν θέλετε να έχετε μια λίγη διασκέδαση για να γράψετε τη δική σας CSV Parser) είναι OpenCSV (Α SourceForge του έργου για την ανάλυση CSV δεδομένων)

Το πλαίσιο Serialization XML πρέπει να είναι κάτι που μπορεί να επεκταθεί σε περίπτωση που θέλετε να μετατρέψουν μεγάλα (ή μεγάλο) αρχείο CSV σε XML: Η σύστασή μου είναι η Sun Java ροής XML Parser Πλαίσιο (Δείτε εδώ ), το οποίο επιτρέπει pull-ανάλυσης ΚΑΙ serialization.

Απαντήθηκε 04/08/2008 στις 02:07
πηγή χρήστη

ψήφοι
7

Απ 'όσο ξέρω, δεν υπάρχει έτοιμα βιβλιοθήκη για να το κάνετε αυτό για σας, αλλά παράγει ένα εργαλείο ικανό να μεταφράζει από CSV σε XML πρέπει μόνο να απαιτούν να γράψετε ένα πρόγραμμα ανάλυσης αργού CSV και συνδέω JDOM (ή XML σας βιβλιοθήκη της Java της επιλογή) με κάποια κωδικό κόλλα.

Απαντήθηκε 02/08/2008 στις 20:06
πηγή χρήστη

ψήφοι
4

Οικογένεια επεξεργαστών Jackson έχει συστήματα υποστήριξης για πολλαπλές μορφές δεδομένων, όχι μόνο JSON. Αυτό περιλαμβάνει και XML ( https://github.com/FasterXML/jackson-dataformat-xml ) και CSV ( https://github.com/FasterXML/jackson-dataformat-csv/ ) του backend.

Η μετατροπή θα βασίζονται στην ανάγνωση εισόδου με CSV backend, γράφουν χρησιμοποιώντας XML backend. Αυτό είναι πιο εύκολο να κάνετε αν έχετε (ή μπορεί να ορίσει) ένα POJO για (CSV) καταχωρήσεις ανά γραμμή. Αυτό δεν είναι μια αυστηρή απαίτηση, όπως περιεχόμενο από CSV μπορεί να διαβαστεί «τυποποιηθεί» καθώς και (μια ακολουθία Stringπινάκων), αλλά απαιτεί λίγο περισσότερη δουλειά στην παραγωγή XML.

Για την πλευρά XML, θα χρειαστείτε ένα αντικείμενο ρίζας περιτύλιγμα να περιέχει πίνακα ή Listτων αντικειμένων σε συνέχειες.

Απαντήθηκε 29/04/2015 στις 20:01
πηγή χρήστη

ψήφοι
3

Είχα το ίδιο πρόβλημα και χρειάζεται μια εφαρμογή για να μετατρέψετε ένα αρχείο CSV σε ένα αρχείο XML για ένα από τα έργα μου, αλλά δεν βρήκε τίποτα δωρεάν και αρκετά καλό στο διαδίκτυο, γι 'αυτό κωδικοποιημένα δική μου εφαρμογή Swing CSVtoXML Java.

Είναι διαθέσιμο από την ιστοσελίδα μου ΕΔΩ . Ελπίζουμε ότι θα σας βοηθήσει.

Αν όχι, μπορείτε εύκολα να κωδικό δική σας, όπως έκανα? Ο πηγαίος κώδικας είναι μέσα στο αρχείο βάζο, ώστε να το τροποποιήσετε όπως χρειάζεται, αν δεν γεμίσουν την απαίτησή σας.

Απαντήθηκε 16/04/2014 στις 01:12
πηγή χρήστη

ψήφοι
3

Για το CSV μέρος, μπορείτε να χρησιμοποιήσετε μικρή βιβλιοθήκη ανοιχτού κώδικα μου

Απαντήθηκε 16/09/2008 στις 17:07
πηγή χρήστη

ψήφοι
3

Αυτό μπορεί να είναι πολύ βασική ή περιορίζεται μιας λύσης, αλλά δεν θα μπορούσατε να κάνετε ένα String.split()σε κάθε γραμμή του αρχείου, θυμόμαστε τη διάταξη αποτέλεσμα της πρώτης γραμμής για τη δημιουργία του XML, και μόλις σούβλα δεδομένων πίνακα κάθε γραμμής με την κατάλληλη XML στοιχεία γεμίσει κάθε επανάληψη του βρόχου;

Απαντήθηκε 01/08/2008 στις 17:31
πηγή χρήστη

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