CSV zu XML konvertieren

Burned

Mitglied
Hallo zusammen,

ich versuch aus einer CSV Datei eine XML Datei zu machen. Die XML Datei will ich dann später noch in Java bearbeiten, sprich bei den einzelnen Personen die Werte in den Elementen ändern. Soweit bin ich gekommen:

Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class Readline {

    public static void main(String[] args) {
        String fileName = "test.csv";
        ArrayList<Integer> margins = new ArrayList<Integer>();
        BufferedReader br;
        String line, token;
        int i;
        int csvCount = 0;
       
        try {
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
           
            // root element
            Document doc = docBuilder.newDocument();
            Element rootElement = doc.createElement("Individuen");
            doc.appendChild(rootElement);
           
            br = new BufferedReader(new FileReader(fileName));
            try {
                while ((line = br.readLine()) != null) {
                    StringTokenizer st = new StringTokenizer(line, ",\"");
                    i = 0;
                    while (st.hasMoreTokens()) {
                        token = st.nextToken();
                        if (margins.size() <= i) {
                            margins.add((Integer) token.length());
                        } else {
                            margins.set(i, Math.max(margins.get(i), (Integer) token.length()));
                        }
                        i++;
                    }
                }
   
                br = new BufferedReader(new FileReader(fileName));
                while ((line = br.readLine()) != null) {
                    StringTokenizer st = new StringTokenizer(line, ",\"");
                    i = 0;
                    while (st.hasMoreTokens()) {
                        token = st.nextToken();
                       
                        if (csvCount == 5){ //Nächste Zahl ist ID (=Menge an Personen)
                            int a = 0;
                            while (a <= Integer.parseInt(token)) {
                                //Erstes Element und "root" der Personen
                                Element person = doc.createElement("Person");
                                rootElement.appendChild(person);
                               
                                //ID Attribut für späteren Aufruf
                                person.setAttribute("id", Integer.toString(a));
                               
                                //Andere Attribute
                                Element attribute = doc.createElement("Attribut_2");
                                person.appendChild(attribute);
                               
                                a++;
                            }
                        }
                        if (token.equals("ID")){
                           
                        }
                        System.out.print(token);
                        System.out.print("|");
                        i++;
                        csvCount++;
                    }
                    System.out.println();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
           
            // XML schreiben
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File("test.xml"));
           
            transformer.transform(source, result);
           
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException pce) {
            pce.printStackTrace();
        } catch (TransformerConfigurationException tce) {
            tce.printStackTrace();
        } catch (TransformerException te) {
            te.printStackTrace();
        }
    }
}

Die gewünschte XML soll am Ende ungefähr so aussehen:

Code:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Individuen>
   <Person id="1">
     <Attribut_1/>
     <Attribut_2/>
     ...
   </Person>
   <Person id="2">
     ...
   </Person>
  ...
</Individuen>

Meine Frage ist jetzt: Wie kann ich automatisch die Attribute als Elemente in die Personen schreiben? Die Werte sind jeweils nur Platzhalter und können zuerst übersehen werden.

Hier noch meine test.csv:

Code:
ID,Attribute 1,Attribute 2,Attribute 3,Attribute 4
105,1,2,3,4

Ich bin mir nicht ganz sicher, ob ich mich verständlich ausgedrückt habe, ansonsten fragt bitte einfach. :)
 

Kababär

Top Contributor
Du könntest zwei Listen anlegen. Ein mal mit den Bezeichnern und einmal mit den Werten.
Dann fragst du ab, ob list.get(x) (mit x als int) gleich ID ist oder so ähnlich. Falls ja, kannst du das x-te Element der anderen Liste nehmen und an die Person hängen.
Anders: besser wäre wohl eine HashMap, deren Key bspw ID lautet und die Values nun alle Werte beinhaltet.
Ich nehme an, du hast irgendwo eine Klasse Person. Dann kannst du diese Klasse dementsprechend aufbauen. Sprich: für jedes ID, Attribut eine HashMap anfertigen.
Ginge relativ einfach und die Personen wiederum in deiner Liste speichern.

Ist vielleicht etwas aufwendig.. aber mag klappen.
 

JStein52

Top Contributor
Das erscheint mir ein bisschen kompliziert. Wenn ich deine CSV-Datei richtig verstehe kannst du doch eine einzige Schleife machen, in der liest du jeweils eine Zeile ein, splittest diese beim "," und baust dir mit den gesplitteten Werten deine XML-Elemente "Person" und "Attribute" auf. In dem String-Array mit den gesplitteten Werten ist das 0.te Element die ID und die anderen werden einfach in eine Schleife als Attribute eingefügt. Oder habe ich deine Frage falsch verstanden ?
 

Burned

Mitglied
Anders: besser wäre wohl eine HashMap, deren Key bspw ID lautet und die Values nun alle Werte beinhaltet.
Ich nehme an, du hast irgendwo eine Klasse Person. Dann kannst du diese Klasse dementsprechend aufbauen. Sprich: für jedes ID, Attribut eine HashMap anfertigen.
Ginge relativ einfach und die Personen wiederum in deiner Liste speichern.

Ich habe noch nie etwas mit HashMaps gemacht, vielleicht ist es dann jetzt der richtige Zeitpunkt es auszuprobieren. Vielen Dank auf jeden Fall für den Tipp, ich versuche mal mein Glück.

Wenn ich deine CSV-Datei richtig verstehe kannst du doch eine einzige Schleife machen, in der liest du jeweils eine Zeile ein, splittest diese beim "," und baust dir mit den gesplitteten Werten deine XML-Elemente "Person" und "Attribute" auf. In dem String-Array mit den gesplitteten Werten ist das 0.te Element die ID und die anderen werden einfach in eine Schleife als Attribute eingefügt.

Das hört sich in der Tat einfacher an, aber ich bin mir nicht sicher, wie ich das umsetzen könnte. Wie gesagt, bin realtiver Anfänger und im Moment habe ich Probleme damit Dinge einfach umzusetzen. Das was ich bis jetzt habe ist aus Tutorials leicht abgewandelt und für meine Zwecke angepasst.
 

Burned

Mitglied
Das erscheint mir ein bisschen kompliziert. Wenn ich deine CSV-Datei richtig verstehe kannst du doch eine einzige Schleife machen, in der liest du jeweils eine Zeile ein, splittest diese beim "," und baust dir mit den gesplitteten Werten deine XML-Elemente "Person" und "Attribute" auf. In dem String-Array mit den gesplitteten Werten ist das 0.te Element die ID und die anderen werden einfach in eine Schleife als Attribute eingefügt. Oder habe ich deine Frage falsch verstanden ?

Habe mir deine Worte zu Herzen genommen und versucht das ganze einfacher zu gestaten. Jetzt also mit OpenCSV und Schleifen um die XML Datei zu befüllen. Ich komme allerdings nicht ganz zurecht. Zum einen schreibt er mir nicht alle Attribute, sondern nur 2 in jede Klasse und zum anderen weiß ich nicht so recht, wie ich OpenCSV dazu bekomme, zunächst nur die erste Zeile der CSV zu betrachen, da das meine Elemente in der XML sein sollen. Hat jemand einen Tipp für mich?

Java:
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.opencsv.CSVReader;

public class ReadCSV {
    public static void main(String[] args) {
        try {
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
           
            // root element
            Document doc = docBuilder.newDocument();
            Element rootElement = doc.createElement("Individuen");
            doc.appendChild(rootElement);
           
            CSVReader reader = new CSVReader(new FileReader("test.csv"));
            //CSVReader copyReader = new CSVReader(new FileReader("test.csv"));
            String [] nextLine;
            String [] copyLine;

            //System.out.println(nextLine[5]);
            while ((nextLine = reader.readNext()) != null) {
                // nextLine[] is an array of values from the line
                //System.out.println(nextLine[0]);
                if (isInteger(nextLine[0])){
                    int numPeople = Integer.parseInt(nextLine[0]);
                   
                    for (int count = 0; count <= numPeople; count++) {
                        CSVReader copyReader = new CSVReader(new FileReader("test.csv"));
                        int i = 1;
                        //System.out.println(count);
                        //Erstes Element und "root" der Personen
                        Element person = doc.createElement("Person");
                        rootElement.appendChild(person);
                       
                        //ID Attribut für späteren Aufruf
                        person.setAttribute("id", Integer.toString(count));
                        while ((copyLine = copyReader.readNext()) != null) {
                            System.out.println(i);
                            System.out.println(copyLine[i]);
                            //Andere Attribute
                            Element attribute = doc.createElement(copyLine[i]);
                            person.appendChild(attribute);
                           
                            i++;
                           
                        }
                    }
                   
                }
            }
            // XML schreiben
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File("test2.xml"));
           
            transformer.transform(source, result);
            } catch (IOException ioe) {
                ioe.printStackTrace();
            } catch (ParserConfigurationException pcee) {
                pcee.printStackTrace();
            } catch (TransformerConfigurationException tce) {
                tce.printStackTrace();
            } catch (TransformerException te) {
                te.printStackTrace();
            }
      }
    //Test, ob String ein Integer ist
    public static boolean isInteger(String str) {
        if (str == null) {
            return false;
        }
        int length = str.length();
        if (length == 0) {
            return false;
        }
        int i = 0;
        if (str.charAt(0) == '-') {
            if (length == 1) {
                return false;
            }
            i = 1;
        }
        for (; i < length; i++) {
            char c = str.charAt(i);
            if (c < '0' || c > '9') {
                return false;
            }
        }
        return true;
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
Avalon String in Double bzw. Währung konvertieren Java Basics - Anfänger-Themen 6
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
I API - zurückgegebener JSON String lesen und in Entity konvertieren Java Basics - Anfänger-Themen 2
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
P String zu int konvertieren nur mit charAt Java Basics - Anfänger-Themen 8
B Milliarden konvertieren Java Basics - Anfänger-Themen 43
B java.io.OutputStream zu java.io.InputStream konvertieren Java Basics - Anfänger-Themen 18
B InputStream (PDF) nach Image (PNG / JPG) konvertieren? Java Basics - Anfänger-Themen 2
B Konvertieren: Outputstream zu Inputstream Java Basics - Anfänger-Themen 13
M Zeichenkette konvertieren Java Basics - Anfänger-Themen 1
B ENUM to List<String> konvertieren Java Basics - Anfänger-Themen 2
L Konvertieren von String zu double?! Java Basics - Anfänger-Themen 6
MiMa String nach float Konvertieren Java Basics - Anfänger-Themen 23
E Datentypen C# String zu Java String konvertieren Java Basics - Anfänger-Themen 3
I HTML Code in Bild (transparent) konvertieren Java Basics - Anfänger-Themen 0
E Inch zu Meilen, Yard, Feet und Inch konvertieren Java Basics - Anfänger-Themen 1
D Enumeration in String konvertieren und ausgeben Java Basics - Anfänger-Themen 1
B Methoden Dateien konvertieren Java Basics - Anfänger-Themen 3
A JAVA Fenster in ein PDF Konvertieren Java Basics - Anfänger-Themen 1
A int in ASCII Konvertieren Java Basics - Anfänger-Themen 6
A Fragmente eines Strings zu einzelnen int konvertieren Java Basics - Anfänger-Themen 3
P String in byte konvertieren, wie? Java Basics - Anfänger-Themen 4
G Objekte aus ArrayList in StringArray konvertieren?! Java Basics - Anfänger-Themen 13
A Bildgröße automatisch auf JLabel Größe konvertieren Java Basics - Anfänger-Themen 9
G String Array konvertieren in Integer Array? Java Basics - Anfänger-Themen 7
A Liste in Array konvertieren Java Basics - Anfänger-Themen 30
J BufferedReader in Integer konvertieren Java Basics - Anfänger-Themen 7
L Datentypen Object zu double zu int konvertieren Java Basics - Anfänger-Themen 6
N Datentypen Datum konvertieren mit kurzer Monatsangabe Java Basics - Anfänger-Themen 3
D Scala Iterable zu Java Collection konvertieren Java Basics - Anfänger-Themen 3
A int in String konvertieren Java Basics - Anfänger-Themen 4
T Fehler beim Konvertieren (String --> Float) Java Basics - Anfänger-Themen 5
F Sonderzeichen bei XML Serialisierung nicht konvertieren Java Basics - Anfänger-Themen 7
H String in anderen zeichensatz Konvertieren? Java Basics - Anfänger-Themen 6
H Monat von Datumausgabe in int konvertieren Java Basics - Anfänger-Themen 3
P 2D Array in 1D konvertieren?? Java Basics - Anfänger-Themen 28
turmaline String zu Date konvertieren -> Unparseable date Java Basics - Anfänger-Themen 5
C Datentypen int[][]-Array nach String[][]-Array konvertieren Java Basics - Anfänger-Themen 7
K StringWriter/String nach InputStream konvertieren Java Basics - Anfänger-Themen 3
D Collection Konvertieren Java Basics - Anfänger-Themen 7
J Konvertieren und Runden von double in int Java Basics - Anfänger-Themen 3
D OOP StringArray in doubleArray konvertieren Java Basics - Anfänger-Themen 13
H Hilfe String in lowercase konvertieren ohne api Java Basics - Anfänger-Themen 4
N String in Double konvertieren? Java Basics - Anfänger-Themen 9
K String von z.B. "\u003C" in Char konvertieren Java Basics - Anfänger-Themen 7
Z Wie Byte[] in einen String oder int konvertieren Java Basics - Anfänger-Themen 2
U von String auf int konvertieren Java Basics - Anfänger-Themen 7
G String in Date konvertieren Java Basics - Anfänger-Themen 6
S String in Datum und wieder in String konvertieren Java Basics - Anfänger-Themen 3
G char[] in byte[] konvertieren? Java Basics - Anfänger-Themen 2
G Jpanel -> BufferedImage konvertieren Java Basics - Anfänger-Themen 7
K Integer in Hex (Little Endian) konvertieren Java Basics - Anfänger-Themen 8
B String in Byte konvertieren Java Basics - Anfänger-Themen 19
T Integer zu Hexadezimal konvertieren Java Basics - Anfänger-Themen 6
G byte array in integer konvertieren Java Basics - Anfänger-Themen 15
N Daten konvertieren von xml in csv Java Basics - Anfänger-Themen 2
G Zeichenkette in char-Array konvertieren Java Basics - Anfänger-Themen 13
M HTML in PDF konvertieren? Java Basics - Anfänger-Themen 10
Q Zeitstempel in Datum konvertieren Java Basics - Anfänger-Themen 2
O Object in Float konvertieren Java Basics - Anfänger-Themen 2
M Int nach String konvertieren? Java Basics - Anfänger-Themen 11
R Konvertieren von Objektadressen Java Basics - Anfänger-Themen 2
S StringBuffer(Buchstabe) -> Double konvertieren Java Basics - Anfänger-Themen 6
D Object to int konvertieren Java Basics - Anfänger-Themen 5
F Boolescher Ausdruck (String) in boolean konvertieren Java Basics - Anfänger-Themen 5
W Java.mysql.date in GregorianCalender konvertieren Java Basics - Anfänger-Themen 2
G ArrayList aus Byte nach Char konvertieren Java Basics - Anfänger-Themen 3
A Referenztypen in primitive Konvertieren Java Basics - Anfänger-Themen 6
B String in int konvertieren Java Basics - Anfänger-Themen 9
B Java in VBA konvertieren? RETTET MEIN LEBEN Java Basics - Anfänger-Themen 14
M long in byte[] konvertieren und wieder zurück Java Basics - Anfänger-Themen 2
F Kann man den Namen einer Variable in ein String Konvertieren Java Basics - Anfänger-Themen 2
D BMP in JPEG konvertieren Java Basics - Anfänger-Themen 2
reibi OutputStream nach ByteOutputStream konvertieren Java Basics - Anfänger-Themen 21
P jar File konvertieren Java Basics - Anfänger-Themen 2
G Datei konvertieren - aber wie Dateiformat einlesen Java Basics - Anfänger-Themen 15
G Pfad konvertieren Java Basics - Anfänger-Themen 9
L String in Array konvertieren Java Basics - Anfänger-Themen 5
S String in ein int wert konvertieren Java Basics - Anfänger-Themen 3
I Zahlen in Unicode konvertieren Java Basics - Anfänger-Themen 37
L von \ in / konvertieren Java Basics - Anfänger-Themen 8
G String in double konvertieren Java Basics - Anfänger-Themen 12
S Konvertieren von Gregorian Calendar nach Date ? Java Basics - Anfänger-Themen 6
H Konvertieren von String nach int Java Basics - Anfänger-Themen 9
P String zu int konvertieren ? Java Basics - Anfänger-Themen 10
S .class in .java konvertieren? Java Basics - Anfänger-Themen 5
G Char Array konvertieren Java Basics - Anfänger-Themen 7
S MBD zu CSV konvertieren Java Basics - Anfänger-Themen 2
G Kommata in Punkten konvertieren Java Basics - Anfänger-Themen 5
F String in Byte[] konvertieren Java Basics - Anfänger-Themen 2
M String in Integer konvertieren Java Basics - Anfänger-Themen 4
T int konvertieren zu double Java Basics - Anfänger-Themen 5
F Double nach Int konvertieren ? Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben