Frage

Gibt es eine vorhandene Anwendung oder Bibliothek? Java wodurch ich a konvertieren kann CSV Datendatei zu XML Datei?

Der XML Tags würden möglicherweise über die erste Zeile bereitgestellt, die Spaltenüberschriften enthält.

War es hilfreich?

Lösung

Vielleicht hilft das hier: JSefa

Mit diesem Tool können Sie CSV-Dateien lesen und in XML serialisieren.

Andere Tipps

Wie die anderen oben kenne ich keinen einfachen Weg, dies zu tun, aber wenn Sie bereit sind, sehr einfache externe Bibliotheken zu verwenden, würde ich Folgendes vorschlagen:

OpenCsv zum Parsen von CSV (klein, einfach, zuverlässig und benutzerfreundlich)

Xstream zum Parsen/Serialisieren von XML (sehr, sehr einfach zu verwenden und vollständig für Menschen lesbares XML zu erstellen)

Unter Verwendung derselben Beispieldaten wie oben würde der Code wie folgt aussehen:

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

Erzeugt das folgende Ergebnis:(Xstream ermöglicht eine sehr feine Abstimmung des Ergebnisses ...)

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

Ich weiß, dass Sie nach Java gefragt haben, aber das scheint mir eine Aufgabe zu sein, die sich gut für eine Skriptsprache eignet.Hier ist eine schnelle (sehr einfache) Lösung, geschrieben 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])
            }
        }
    }
}

Schreibt das folgende XML nach 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>

Allerdings führt der Code eine sehr einfache Analyse durch (ohne Berücksichtigung von Anführungszeichen oder Escape-Kommas) und berücksichtigt nicht mögliche fehlende Daten.

Ich habe ein Open-Source-Framework für die Arbeit mit CSV und Flatfiles im Allgemeinen.Vielleicht ist es einen Blick wert: JFileHelpers.

Mit diesem Toolkit können Sie Code mit Beans schreiben, wie zum Beispiel:

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

und analysieren Sie dann einfach Ihre Textdateien mit:

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

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

Und Sie erhalten eine Sammlung analysierter Objekte.

Hoffentlich hilft das!

Diese Lösung benötigt keine CSV- oder XML-Bibliotheken und behandelt, wie ich weiß, keine illegalen Zeichen und Kodierungsprobleme, aber Sie könnten auch daran interessiert sein, vorausgesetzt, Ihre CSV-Eingabe verstößt nicht gegen die oben genannten Regeln.

Aufmerksamkeit: Sie sollten diesen Code nicht verwenden, es sei denn, Sie wissen, was Sie tun, oder Sie haben keine Möglichkeit, eine weitere Bibliothek zu verwenden (möglich bei einigen bürokratischen Projekten) ...Verwenden Sie einen StringBuffer für ältere Laufzeitumgebungen ...

Auf geht's:

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

Die Eingabe test.csv (aus einer anderen Antwort auf dieser Seite gestohlen):

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

Die resultierende Ausgabe:

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

Der große Unterschied besteht darin JSefa Der Vorteil besteht darin, dass es Ihre Java-Objekte in CSV/XML/etc-Dateien serialisieren und wieder in Java-Objekte deserialisieren kann.Und es wird durch Anmerkungen gesteuert, die Ihnen viel Kontrolle über die Ausgabe geben.

JFileHelpers sieht auch interessant aus.

Ich verstehe nicht, warum Sie das tun möchten.Es klingt fast wie Cargo-Kult-Codierung.

Das Konvertieren einer CSV-Datei in XML bringt keinen Mehrwert.Ihr Programm liest die CSV-Datei bereits, daher funktioniert die Behauptung, dass Sie XML benötigen, nicht.

Auf der anderen Seite lesen Sie die CSV-Datei etwas mit den Werten, und dann macht die Serialisierung nach XML Sinn (nun ja, so sehr die Verwendung von XML sinnvoll sein kann ...;)), aber Sie hätten angeblich bereits eine Möglichkeit zur Serialisierung in XML.

Mit Groovy geht das ganz einfach und der Code ist sehr gut lesbar.

Grundsätzlich wird in die Textvariable geschrieben contacts.xml für jede Zeile in der contactData.csv, und das Feldarray enthält jede Spalte.

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

Du könntest benutzen XSLT.Google es und du wirst ein paar Beispiele finden, z.B. CSV zu XMLWenn du benutzt XSLT Anschließend können Sie das XML in das gewünschte Format konvertieren.

Es gibt auch eine gute Bibliothek ServingXML von Daniel Parker, das nahezu jedes reine Textformat in XML und zurück konvertieren kann.

Das Beispiel für Ihren Fall finden Sie hier Hier:Es verwendet die Feldüberschrift in der CSV-Datei als XML-Elementnamen.

Mir ist nichts bekannt, was dies bewerkstelligen könnte, ohne dass Sie zumindest ein wenig Code schreiben würden ...Sie benötigen zwei separate Bibliotheken:

  • Ein CSV-Parser-Framework
  • Ein XML-Serialisierungs-Framework

Der CSV-Parser, den ich empfehlen würde (es sei denn, Sie möchten ein bisschen Spaß daran haben, Ihren eigenen CSV-Parser zu schreiben), ist OpenCSV (ein SourceForge-Projekt zum Parsen von CSV-Daten).

Das XML Serialization Framework sollte skalierbar sein, falls Sie große (oder riesige) CSV-Dateien in XML umwandeln möchten:Meine Empfehlung ist das Sun Java Streaming XML Parser Framework (siehe Hier), was Pull-Parsing UND Serialisierung ermöglicht.

Soweit ich weiß, gibt es keine vorgefertigte Bibliothek, die dies für Sie erledigt, aber um ein Tool zu erstellen, das von CSV in XML übersetzen kann, sollten Sie lediglich einen groben CSV-Parser schreiben und JDOM (oder Ihre XML-Java-Bibliothek) anschließen Wahl) mit etwas Klebecode.

Die Jackson-Prozessorfamilie verfügt über Backends für mehrere Datenformate, nicht nur für JSON.Dies umfasst sowohl XML (https://github.com/FasterXML/jackson-dataformat-xml) und CSV (https://github.com/FasterXML/jackson-dataformat-csv/) Backends.

Die Konvertierung würde auf dem Lesen der Eingabe mit dem CSV-Backend und dem Schreiben mit dem XML-Backend beruhen.Dies ist am einfachsten, wenn Sie ein POJO für zeilenweise Einträge (CSV) haben (oder definieren können).Dies ist keine strenge Anforderung, da Inhalte aus CSV auch „untypisiert“ gelesen werden können (eine Folge von String Arrays), erfordert aber etwas mehr Arbeit an der XML-Ausgabe.

Für die XML-Seite benötigen Sie ein Wrapper-Stammobjekt, das Array oder enthält List der zu serialisierenden Objekte.

Dies ist möglicherweise eine zu einfache oder eingeschränkte Lösung, aber Sie könnten keine Lösung finden String.split() in jeder Zeile der Datei das Ergebnis-Array der ersten Zeile merken, um das XML zu generieren, und einfach die Array-Daten jeder Zeile mit den richtigen XML-Elementen ausspucken, die jede Iteration einer Schleife auffüllen?

Ich hatte das gleiche Problem und brauchte für eines meiner Projekte eine Anwendung zum Konvertieren einer CSV-Datei in eine XML-Datei, fand aber im Netz nichts Kostenloses und Gutes, also habe ich meine eigene Java Swing CSVtoXML-Anwendung programmiert.

Es ist auf meiner Website erhältlich HIER.Ich hoffe, es wird Ihnen helfen.

Wenn nicht, können Sie wie ich ganz einfach Ihre eigenen programmieren.Der Quellcode befindet sich in der JAR-Datei. Ändern Sie ihn also nach Bedarf, wenn er Ihren Anforderungen nicht entspricht.

Für den CSV-Teil können Sie verwenden meine kleine Open-Source-Bibliothek

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top