Bearbeitung von csv Dateien

zlFavourite

Aktives Mitglied
Hallo,
vorab ich bin mir nicht sicher ob ich hier in dem richtigen Forum bin ^^.
Nun zu meinem eigentlichen Problem. Ich habe ein Projekt erstellt in dem ich unter anderem meine Daten aus meiner SQL Datenbank exportieren möchte und dieser in einer Csv Datei speichern möchte. Dies funktioniert an sich auch schon. Nur gibt es dabei noch zwei Komplikationen. Wenn ich mehrere Daten speichern möchte, setzt es mir immer wieder neue Überschriften. Was ich also sagen will ist, ich möchte bevor ich etwas in meine csv Datei speicher, überprüfen ob etwas drin steht und wenn ja soll es mir das rauslöschen.
Mein zweites Problem ist, da ich ja in Java Datentypen wie Double mit einem "." trenne und in einer csv Datei mit einem "," trenne kommt es dort auch zu Komplikationen. Das heißt ich muss die Punkte in Kommas bei der Datenübertragung umwandeln.
Mein Lehrer hat heute 20 Minuten danach geschaut aber, konnte selber keine Lösung finden...
Bitte um Hilfe :)
Hier ist mein Code um meine Daten aus der Datenbank in eine Csv Datei zu schreiben:
Java:
private void exportieren(){   
            System.out.println("1");
            try {
                PrintWriter pw = new PrintWriter(new File("test.csv"));
                StringBuilder sb = new StringBuilder();
                System.out.println("2");
                sb.append("id");
                sb.append(';');
                sb.append("datum");
                sb.append(';');
                sb.append("gewicht");
                sb.append(';');
                sb.append("groesse");
                sb.append(';');
                sb.append("jahreshalter");
                sb.append(';');
                sb.append("sport");
                sb.append('\n');
                pw.write(sb.toString());
                System.out.println("3");
           
           
                    while(vTabelle2.next()){           
           
                        sb.append((vTabelle2.getString("id")));
                        sb.append(';');
                        sb.append((vTabelle2.getString("datum")));
                        sb.append(';');
                        sb.append((vTabelle2.getString("gewicht")));
                        sb.append(';');
                        sb.append((vTabelle2.getString("groesse")));
                        sb.append(';');
                        sb.append((vTabelle2.getString("jahresalter")));
                        sb.append(';');
                        sb.append((vTabelle2.getString("sport")));
                        sb.append('\n');
       
                        pw.write(sb.toString());
                       
                        System.out.println("done!");
                    }
                   
                    pw.close();
       
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
            catch(Exception fehler1){
                }
            }
 

mihe7

Top Contributor
Wenn ich mehrere Daten speichern möchte, setzt es mir immer wieder neue Überschriften. Was ich also sagen will ist, ich möchte bevor ich etwas in meine csv Datei speicher, überprüfen ob etwas drin steht und wenn ja soll es mir das rauslöschen.
Du solltest halt den über den StringBuilder erzeugten String halt nur einmal rausschreiben.

Mein zweites Problem ist, da ich ja in Java Datentypen wie Double mit einem "." trenne und in einer csv Datei mit einem "," trenne kommt es dort auch zu Komplikationen.
Da Dein Feldtrenner ein Semikolon ist, spielt das Komma für die Spalten keine Rolle. Dann geht es höchsten um das Zahlenformat. Wie hättest Du es gerne?
 

zlFavourite

Aktives Mitglied
Du solltest halt den über den StringBuilder erzeugten String halt nur einmal rausschreiben.
Was genau meinst du damit ?
upload_2019-2-21_19-47-2.png
So sieht meine Csv Datei aus wenn ich die daten exportiere.
Mit dem Komma meine ich das Feld mit der groesse. In meiner Datenbank habe ich die groesse als double und z.B den Wert 1.7. Diesen hat es mir nun als Datum zu 1.Juli umgewandelt.
 

mihe7

Top Contributor
Was genau meinst du damit ?
Du fügst in jeder Iteration Deiner Schleife eine Zeile zum String hinzu UND schreibst den kompletten String raus.

it dem Komma meine ich das Feld mit der groesse. In meiner Datenbank habe ich die groesse als double und z.B den Wert 1.7. Diesen hat es mir nun als Datum zu 1.Juli umgewandelt.
Das ist nur eine Excel-Geschichte. Du kannst beim Importieren das Datenformat angeben bzw. das Zellformat einstellen.
 

zlFavourite

Aktives Mitglied
Du fügst in jeder Iteration Deiner Schleife eine Zeile zum String hinzu UND schreibst den kompletten String raus.


Das ist nur eine Excel-Geschichte. Du kannst beim Importieren das Datenformat angeben bzw. das Zellformat einstellen.

Was ich dann aber nicht ganz verstehe ist, wie ich meine Daten sonst einschreiben soll wenn ich sie nicht jedes mal mit einem String übergebe. Stehe gerade voll auf dem Schlauch ...

Das habe ich auch schon gelesen, dass man das in Excel einstellen kann. Mein Problem ist nur, dass mein Programm auf verschiedenen PC s laufen muss und da kann ich nicht jedes mal die Exceleinstellungen ändern.
 

mihe7

Top Contributor
Was ich dann aber nicht ganz verstehe ist, wie ich meine Daten sonst einschreiben soll wenn ich sie nicht jedes mal mit einem String übergebe.
Entweder erzeugst Du nach jeder Iteration ein neues StringBuilder-Objekt oder Du schreibst das StringBuilder-Objekt nach der Schleife raus.

Mein Problem ist nur, dass mein Programm auf verschiedenen PC s laufen muss und da kann ich nicht jedes mal die Exceleinstellungen ändern.
Wenn Du unbedingt deutsche Formatierung haben willst, kannst Du natürlich mit DecimalFormat arbeiten:
Java:
NumberFormat nf = DecimalFormat.getInstance(Locale.GERMAN);
String formatiert = nf.format(zahl);
 

mihe7

Top Contributor
Java:
private void exportieren(){  
            System.out.println("1");
            try {
                PrintWriter pw = new PrintWriter(new File("test.csv"));
                StringBuilder sb = new StringBuilder();
                System.out.println("2");
                sb.append("id");
                sb.append(';');
                sb.append("datum");
                sb.append(';');
                sb.append("gewicht");
                sb.append(';');
                sb.append("groesse");
                sb.append(';');
                sb.append("jahreshalter");
                sb.append(';');
                sb.append("sport");
                sb.append('\n');
                pw.write(sb.toString());         
                System.out.println("3");
           
           
                    while(vTabelle2.next()){
                        sb = new StringBuilder();                     
                        sb.append((vTabelle2.getString("id")));
                        sb.append(';');
                        sb.append((vTabelle2.getString("datum")));
                        sb.append(';');
                        sb.append((vTabelle2.getString("gewicht")));
                        sb.append(';');
                        sb.append((vTabelle2.getString("groesse")));
                        sb.append(';');
                        sb.append((vTabelle2.getString("jahresalter")));
                        sb.append(';');
                        sb.append((vTabelle2.getString("sport")));
                        sb.append('\n');                             
                        pw.write(sb.toString());
                        System.out.println("done!");
                    }
                    pw.close();
       
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
            catch(Exception fehler1){
                }
            }

oder

Java:
private void exportieren(){  
            System.out.println("1");
            try {
                PrintWriter pw = new PrintWriter(new File("test.csv"));
                StringBuilder sb = new StringBuilder();
                System.out.println("2");
                sb.append("id");
                sb.append(';');
                sb.append("datum");
                sb.append(';');
                sb.append("gewicht");
                sb.append(';');
                sb.append("groesse");
                sb.append(';');
                sb.append("jahreshalter");
                sb.append(';');
                sb.append("sport");
                sb.append('\n');
                System.out.println("3");
           
           
                    while(vTabelle2.next()){                     
                        sb.append((vTabelle2.getString("id")));
                        sb.append(';');
                        sb.append((vTabelle2.getString("datum")));
                        sb.append(';');
                        sb.append((vTabelle2.getString("gewicht")));
                        sb.append(';');
                        sb.append((vTabelle2.getString("groesse")));
                        sb.append(';');
                        sb.append((vTabelle2.getString("jahresalter")));
                        sb.append(';');
                        sb.append((vTabelle2.getString("sport")));
                        sb.append('\n');                             
                        System.out.println("done!");
                    }
                    pw.write(sb.toString());                   
                    pw.close();
       
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
            catch(Exception fehler1){
                }
            }
 

zlFavourite

Aktives Mitglied
Entweder erzeugst Du nach jeder Iteration ein neues StringBuilder-Objekt oder Du schreibst das StringBuilder-Objekt nach der Schleife raus.


Wenn Du unbedingt deutsche Formatierung haben willst, kannst Du natürlich mit DecimalFormat arbeiten:
Java:
NumberFormat nf = DecimalFormat.getInstance(Locale.GERMAN);
String formatiert = nf.format(zahl);

Vielen Dank, der Datenexport funktioniert nun eiwandfrei. Das mit der Decimalkonvertertierung muss ich noch nachschauen.
 

zlFavourite

Aktives Mitglied
Entweder erzeugst Du nach jeder Iteration ein neues StringBuilder-Objekt oder Du schreibst das StringBuilder-Objekt nach der Schleife raus.


Wenn Du unbedingt deutsche Formatierung haben willst, kannst Du natürlich mit DecimalFormat arbeiten:
Java:
NumberFormat nf = DecimalFormat.getInstance(Locale.GERMAN);
String formatiert = nf.format(zahl);
Danke für deine Hilfe aber irgendwie verstehe ich nicht wie das gehen soll...
 

mihe7

Top Contributor
?!?
Java:
// vor der Schleife
NumberFormat nf = DecimalFormat.getInstance(Locale.GERMAN);
// in der Schleife z. B. 
double groesse = vTabelle2.getDouble("groesse");
sb.append(nf.format(groesse));
 

mihe7

Top Contributor
Natürlich, hier mal ein paar Möglichkeiten.

Der einfachste Weg: bereits in der SQL-Abfrage am Ende ein "ORDER BY datum" (aufsteigend) oder "ORDER BY datum DESC" (absteigend) einfügen.

Sonst: jeden Datensatz als Objekt in einer Liste zwischenspeichern und diese nach Datum sortieren.

Wenn die CSV bereits geschrieben ist: aus der CSV einlesen, sortieren und wieder schreiben. Wenn die CSV sehr groß ist: Mergesort.
 

zlFavourite

Aktives Mitglied
Natürlich, hier mal ein paar Möglichkeiten.

Der einfachste Weg: bereits in der SQL-Abfrage am Ende ein "ORDER BY datum" (aufsteigend) oder "ORDER BY datum DESC" (absteigend) einfügen.

Sonst: jeden Datensatz als Objekt in einer Liste zwischenspeichern und diese nach Datum sortieren.

Wenn die CSV bereits geschrieben ist: aus der CSV einlesen, sortieren und wieder schreiben. Wenn die CSV sehr groß ist: Mergesort.


Java:
private void dbOeffnen() {
           
// Öffnen der Datenbankverbindung
            db1.oeffneDB();
            db2.oeffneDB();
           
            String vSQL = "";
            vSQL = vSQL+"SELECT * ";
            vSQL = vSQL+"FROM gewicht;";
// SQL Anweisung ausführen
            vTabelle = db1.lesen(vSQL);
            vTabelle2 = db2.lesen(vSQL);
        }
Das ist mein Abfrage Befehl. Aber wenn ich da ein ORDER BY dran hänge bekomme ich eine Fehlermeldung...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Swing CellEditor bei Fokusverlust Bearbeitung beenden?! AWT, Swing, JavaFX & SWT 6
G Bild nach Bearbeitung schwarz AWT, Swing, JavaFX & SWT 4
M Java Dateien kopieren mit Fortschrittsbalken AWT, Swing, JavaFX & SWT 13
frager2345 Bild aus Dateien lesen und als Hintergrund verwenden AWT, Swing, JavaFX & SWT 2
N Dateien einlesen und in GUI immernoch auswählbar AWT, Swing, JavaFX & SWT 1
MiMa File Dateien im ListView als Name anzeigen? AWT, Swing, JavaFX & SWT 6
H JavaFX Media Dateien zu VideoPlayerController senden AWT, Swing, JavaFX & SWT 10
VPChief Gibt es eine möglichkeit Dateien aus der jar datei zu kopieren? AWT, Swing, JavaFX & SWT 46
F Output Stream / File Dateien / Speichern AWT, Swing, JavaFX & SWT 13
J JavaFX Wie verhindere ich das gleichzeitige Spielen von Dateien bei Mediaplayer JavaFX? AWT, Swing, JavaFX & SWT 3
E JavaFX Umgang mit SVG-Dateien AWT, Swing, JavaFX & SWT 0
S Swing JFileChooser best. Ordner wie Dateien behandeln AWT, Swing, JavaFX & SWT 4
D Dateien öffnen AWT, Swing, JavaFX & SWT 16
S Swing txt Dateien öffnen mit JFilleChooser AWT, Swing, JavaFX & SWT 4
B Swing Dateien im Swing-GUI anzeigen AWT, Swing, JavaFX & SWT 3
H RCP(SWT) Browser-Widget zeigt keine locale HTML-Dateien an AWT, Swing, JavaFX & SWT 1
E 2D-Grafik Speicherprobleme große Tiff-Dateien AWT, Swing, JavaFX & SWT 50
C 2D-Grafik Steganographie - Verschlüsselung von Dateien in Bildern - Bilder zeigen schwarze Rechtecke AWT, Swing, JavaFX & SWT 13
M Swing Dateien auf Muster analysieren AWT, Swing, JavaFX & SWT 30
J Auf Dateien in JTree zugreifen AWT, Swing, JavaFX & SWT 15
MiMa Dateien aus Ordner in einer JList Ausgeben AWT, Swing, JavaFX & SWT 32
Daniel_L Drop von Dateien auf Frame - welche Drop-Location? AWT, Swing, JavaFX & SWT 2
H * Einlesen von Text-Dateien & Zeichensatz bestimmen AWT, Swing, JavaFX & SWT 2
K JFileChooser mehrere Dateien markieren ohne STRG AWT, Swing, JavaFX & SWT 4
N verschieben von Dateien auf der Festplatte über TreePaths funktioniert nicht AWT, Swing, JavaFX & SWT 10
F AWT DnD von Dateien mit Sonderzeichen funktioniert unter Linux nicht AWT, Swing, JavaFX & SWT 3
B ImageIO gif Dateien laden AWT, Swing, JavaFX & SWT 7
D LayoutManager Main layout auf andere Class Dateien verweisen? AWT, Swing, JavaFX & SWT 17
R Windows-Dateien auf GUI ziehen AWT, Swing, JavaFX & SWT 3
M Swing JTable Drag'n'Drop von Dateien AWT, Swing, JavaFX & SWT 3
S Dateien kopieren mit ProgressBar AWT, Swing, JavaFX & SWT 6
T SWT Wie Bilder aus JAR-Dateien einbinden? AWT, Swing, JavaFX & SWT 12
Developer_X Java BMP-Dateien laden AWT, Swing, JavaFX & SWT 2
T Compiler erzeugt mehrere .class Dateien AWT, Swing, JavaFX & SWT 2
K Per ComboBox Dateien einlesen AWT, Swing, JavaFX & SWT 23
G JFileChooser - erkennen v. existierenden Dateien ohne Endung AWT, Swing, JavaFX & SWT 1
I Dateien durchsuchen AWT, Swing, JavaFX & SWT 7
P Dateien per Drag&Drop ins Java-Fenster ziehen AWT, Swing, JavaFX & SWT 8
A Dateien in TextArea ausgeben AWT, Swing, JavaFX & SWT 6
G Dynamische Menüs mit Liste von MRU Dateien AWT, Swing, JavaFX & SWT 2
J Dateien einlesen AWT, Swing, JavaFX & SWT 3
E JList und Drag&Drop von Dateien AWT, Swing, JavaFX & SWT 1
H JFileChooser für alle Dateien und Directories unterhalb AWT, Swing, JavaFX & SWT 7
K SystemIcons v. Dateien & Verz. im TreeView anzeigen AWT, Swing, JavaFX & SWT 2
A JFileChooser - Mehrere Dateien per Maus markieren (nokeys) AWT, Swing, JavaFX & SWT 7
S Probleme beim Laden und Speichern von Dateien AWT, Swing, JavaFX & SWT 6
J Word/Excel-Dateien mit Button öffnen AWT, Swing, JavaFX & SWT 5
O Dateien aus Verzeichnis filtern und in JTable darstellen AWT, Swing, JavaFX & SWT 3
G JFileChooser: nur *.gif-Dateien anzeigen AWT, Swing, JavaFX & SWT 5
EagleEye GUI in mehrere Dateien aufteilen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben