CSV einlesen und mit Komma trennen

slimma

Mitglied
Hallo zusammen :) ,

ich hab eine Aufgabe bekommen eine CSV Datei einzulesen die aus Name und Nachname besteht und diese in einer neuen csv neu zu schreiben, sodass die Namen mit Komma getrennt sind. Also im Prinzip das Leerzeichen durch ein Komma zu ersetzten und Exel aus Name und Nachname letzlich 2 Spalten erstellt. Mir wurde nahe gelegt die Klassen PrintWriter und Scanner zu nutzen. Danach soll die Split Methode verwendet werden. Ich habe mir jetzt das Hirn zermatert aber ich komme auf keinen Lösungsansatz. Kann mir vielleicht wer unter die Arme greifen?

Danke schon mal und Grüße
 

LimDul

Top Contributor
Erster Schritt sollte sein, das Problem mal lösgelöst von konkreten Klassen zu betrachten und ggf. in kleinere Einzelproblem zu zerlegen. Das ist eine Strategie, die die eigentlich immer beim entwickeln hilft (nur das kleinste Problem, was man sich direkt zutraut abzuarbeiten wird immer größer)

Was ist die Aufgabenstellung:

Eingabe, eine Datei anscheinend wie folgt aussieht:

Code:
Max Mustermann
Maria Musterfrau
....

Ausgabe soll eine Datei sein, die folgt aussieht:
Code:
Max,Mustermann
Maria,Musterfrau

Jetzt kann man anfangen sich einzelne Schritte zu überlegen. Eine Möglichkeit wäre es in folgende Unter-Probleme zu zerlegen:

* Einlesen der Datei zeilenweise
* Verarbeiten einer einzelnen Zeile
* Schreiben der Ausgabedatei Zeilenweise

Das kann man nur weiter zerlegen

* Einlesen der Datei zeilenweise
* Verarbeiten einer einzelnen Zeile
** Zerlegen einer einzelnen Zeile am " " in einzelne Blöcke
** Zusammenfügen der Blöcke durch "," getrennt
* Schreiben der Ausgabedatei Zeilenweise

Und jetzt kannst du mal anfangen und versuchen für einzelnen Dinge sukzessive einzelne Lösungen zu erstellen. Und da kommen jetzt die erwähnten Klassen ggf. in Spiel.
 

M.L.

Top Contributor
Eine potentielle Falle *könnte* darin bestehen, dass beim manuellen Ersetzen von " " durch "," am Ende ein Komma zuviel erscheint (und geeignet behandelt werden will)
Java:
import java.util.StringTokenizer;
public class Scanner_csv {
  public static void main(String[] args) {
StringTokenizer st = new StringTokenizer("Maria Mustermann"," ");
 while (st.hasMoreTokens()) {
 System.out.print(st.nextToken() +",");
 } 
  }
}
Output: Maria,Mustermann,
 

Oneixee5

Top Contributor
Eine potentielle Falle *könnte* darin bestehen, dass beim manuellen Ersetzen von " " durch "," am Ende ein Komma zuviel erscheint (und geeignet behandelt werden will)
Java:
import java.util.StringTokenizer;
public class Scanner_csv {
  public static void main(String[] args) {
StringTokenizer st = new StringTokenizer("Maria Mustermann"," ");
while (st.hasMoreTokens()) {
System.out.print(st.nextToken() +",");
}
  }
}
Output: Maria,Mustermann,
In der API steht dazu: StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. Weiterhin ist dieser Code, für einen Neuling irritierend da er an der Aufgabe vorbei geht. Denn es soll ja offensichtlich die Methode split der Klasse String verwendet werden. Das Resultat dieser Methode ist ein Array aus String's. Dieses String-Array kann man mit dem neuen Trennzeichen "," einfach über String.join(",", tokens) zusammenfassen. Das Problem mit dem Trennzeichen am Ende der Zeile besteht also gar nicht.
 

mrBrown

Super-Moderator
Mitarbeiter
Das Problem besteht schon deshalb nicht, da immer genau zwei Teile durch ein Komma getrennt werden sollen, nicht beliebig viele.
 

slimma

Mitglied
Danke für eure Anregungen und Tips:

Ich habe es folgendermaßen umgesetzt falls es von Interesse ist:

Java:
[/B]
import java.io.File;
import javax.swing.JOptionPane;
import java.util.Scanner;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.FileReader;
/**
 * Datei auslesen, neue Datei erzeugen,
 * Werte Schreiben und formatieren,
 *  
 *
 * @version 1.0 vom 15.02.2021
 * @Slimma
 */

public class NamenTrennen {
  
  public static void main(String[] args) throws IOException {
    try {
      PrintWriter erzeugen = new PrintWriter("c:/temp/Namengetrennt.csv");   //Datei erzeugen
      Scanner einlesen = new Scanner(new FileReader("c:/Temp/Namen.csv"));   //Datei Einlesen
      String daten = "";                                                     //String deklarieren
      
      while (einlesen.hasNextLine()) {                                       //Schleife solange die Datei eine neue Zeile hat
        daten = einlesen.nextLine();                                         //String wird mit Daten gefüllt
        System.out.println(daten);                                           //Kontrolle eingelsene Zeilen
        String[] teilen = daten.split(" ");                                  //Array erzeugt und die Daten werden geteilt an Stelle mit Leerzeichen
        for (int i=teilen.length-1;i>=0 ;i--) {                              //startwert ist der höchste Array Index, um den Nachnamen an erster Stelle zu bringen
          erzeugen.printf(teilen[i]);                                        //der Array Wert wird in die Datei geschrieben 
          if (i==teilen.length-1) {                                          //Komma nach dem höchsten Array (Nachnamen) Wert geschrieben ansonsten ein Leerzeichen
            erzeugen.printf(", ");
          } else {
             erzeugen.printf(" ");
            } // end of if-else// end of if
          
        } // end of for
        erzeugen.printf("\n");                                               //Zeilenumbruch                                                                  
      } // end of while
      einlesen.close();
      erzeugen.close();
    } catch(Exception e) {
      JOptionPane.showMessageDialog(null, "Unerwarteter Fehler wenden sie sich an den Administrator " + e);
    } // end of try
  } // end of main

} // end of class NamenTrennen

[B]
 

Oneixee5

Top Contributor
Ich hätte dazu folgende Anmerkungen:
  • Namen könnten Leerzeichen enthalten (Doppelnamen), daher würde ich String[] teilen = daten.split(" ", 2); verwenden um die Länge von teilen zu begrenzen
  • for-Schleife und if-Konstrukt ist nicht notwendig: erzeugen.println(String.join(",", teilen)); reicht völlig aus auch erzeugen.println(teilen[0] + "," teilen[1]); reicht - mit Prüfung auf Leerzeile if (teilen.length > 1) wenn nicht erwünscht
  • printf ist hier falsch angewendet, s. API
  • Ressourcen werden im Fehlerfall möglicherweise nicht richtig geschlossen, fehlender finally-Block, sie dir besser auch die try() {}-Schreibweise an, [I]AutoCloseable[/I]-Interface https://www.baeldung.com/java-try-with-resources
Im einfachsten Fall würde das bei mir so aussehen:
Java:
        try (
            PrintWriter out = new PrintWriter(System.out, true);   
            Scanner scanner = new Scanner(
                    "Maria Mustermann"
                    + System.lineSeparator()
                    + System.lineSeparator()
                    + "Maria Muster Frau"
                    + System.lineSeparator());
        ) {
            while (scanner.hasNextLine()) {
                out.println(String.join(",", scanner.nextLine().split(" ", 2)));
            }   
        }
lesbarer dann so:
Java:
        try (
            PrintWriter out = new PrintWriter(System.out, true);   
            Scanner scanner = new Scanner(
                    "Maria Mustermann"
                    + System.lineSeparator()
                    + System.lineSeparator()
                    + "Maria Muster Frau"
                    + System.lineSeparator());
        ) {
            String line;
            String[] tokens;
            String newLine;
            while (scanner.hasNextLine()) {
                line = scanner.nextLine();
                tokens = line.split(" ", 2);
                if (tokens.length > 1) {
                    newLine = String.join(",", tokens[1], tokens[0]);
                    out.println(newLine);
                }
            }       
        }
[CODE title="Ausgabe"]
Mustermann,Maria
Muster Frau,Maria
[/CODE]
(Zur Vereinfachung ohne Dateien)
 
Zuletzt bearbeitet:

Oneixee5

Top Contributor
Noch eine Anmerkung: Kommentare im Code sind verpönt und störend. Sie sollten nur in absolut begründeten Ausnahmen angewendet werden. Im Code steht ja genau drin was gemacht wird. Kommentare gehören über die Methode bzw. Klasse. Damit ist es dann möglich automatisch eine API-Dokumentation zu erzeugen.
Java:
// I never trust internal program documentation
 
Zuletzt bearbeitet:
G

Gelöschtes Mitglied 65838

Gast
Eine CSV datei hat den Großen unterschied einen Delimiter zu haben
die meisten nehmen ; als delimiter her und da kannst du dann dran arbeiten objekte am delimiter zu unterscheidne und auf zuteilen


AUSSERDEM

Powershell hat fantastische CSV bearbeitungs cmdlets die SEHR einfach sind
2 Zeilen in Powershell könnten dien Problem lösen
jedoch wenn java gefordert wird dann kann man nicht aus
 
Zuletzt bearbeitet von einem Moderator:
G

Gelöschtes Mitglied 65838

Gast
Noch eine Anmerkung: Kommentare im Code sind verpönt und störend. Sie sollten nur in absolut begründeten Ausnahmen angewendet werden. Im Code steht ja genau drin was gemacht wird. Kommentare gehören über die Methode bzw. Klasse. Damit ist es dann möglich automatisch eine API-Dokumentation zu erzeugen.
Java:
// I never trust internal program documentation
Kommentare werden in der Arbeit immer verlangt für "gute Dokumentation"....
dann steht halt sowas in deinem java programm drin

// new button
Button but = new Button();

was zu absoluten schwachsinn hinläuft aber man muss tun was der chef sagt


bei komplexeren methoden wo man 3 verschachtelte schleifen hat machen kommentare zur erklärung durchaus sinn aber

menschen sind fehlerhaft
und der Code lügt niemals
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
G JTree speichern und wieder einlesen Java Basics - Anfänger-Themen 5
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
S SeriellenPort einlesen Java Basics - Anfänger-Themen 3
I XML einlesen und Objekte bekommen Java Basics - Anfänger-Themen 2
M Daten aus .txt Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 80
julian0507 Wörter einlesen lassen und rückwärts ausgeben Java Basics - Anfänger-Themen 7
S JSON einlesen und benutzen Java Basics - Anfänger-Themen 5
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
I Ical4j / Kalender einlesen von URL - Fehler: "Unparseable date" Java Basics - Anfänger-Themen 16
Saiko Zeilen einer Datei einlesen Java Basics - Anfänger-Themen 3
sserio Txt Datei einlesen Java Basics - Anfänger-Themen 9
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
julian112 Input/Output .gz bzw. .txt Datei Einlesen und Umgang mit Exceptions Java Basics - Anfänger-Themen 1
M String beim einlesen formatieren Java Basics - Anfänger-Themen 12
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
G JSP Textfeld einlesen Java Basics - Anfänger-Themen 2
M Einlesen > new Leser Java Basics - Anfänger-Themen 5
W Werte durch Konsole einlesen Java Basics - Anfänger-Themen 10
A Array einlesen und ausgeben Java Basics - Anfänger-Themen 13
K Datum einlesen und Tag, Monat und Jahr einzeln ausgeben Java Basics - Anfänger-Themen 1
K Datum einlesen und Tag, Monat und Jahr einzeln ausgeben Java Basics - Anfänger-Themen 1
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
S Wort einlesen Array ausgeben Java Basics - Anfänger-Themen 4
I Java String einlesen und auslesen Java Basics - Anfänger-Themen 11
A Input/Output Mehrere Csv-Dateien einlesen Java Basics - Anfänger-Themen 2
CptK Richtigen Pfad beim einlesen von Datei finden Java Basics - Anfänger-Themen 2
I Java-Wort einlesen und ausgeben Java Basics - Anfänger-Themen 7
J Csv-Datei einlesen Java Basics - Anfänger-Themen 52
JD_1998 Arrays einlesen, zwischenspeichern und wieder ausgeben Java Basics - Anfänger-Themen 8
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
L Datein einlesen Java Basics - Anfänger-Themen 1
O zufälliges Wort aus einer Datei einlesen Java Basics - Anfänger-Themen 32
E Input/Output Datei anhand von Dateinamen einlesen Java Basics - Anfänger-Themen 5
C Datei über relative Pfade einlesen Java Basics - Anfänger-Themen 6
A Input/Output Dateien einlesen und ausgeben Java Basics - Anfänger-Themen 7
A Klasse um daten zu einlesen Java Basics - Anfänger-Themen 26
A 2d Arrays aus txt.file einlesen Java Basics - Anfänger-Themen 16
A Textdatei mit stream einlesen Java Basics - Anfänger-Themen 2
P Datei einlesen und zurückgeben Java Basics - Anfänger-Themen 5
G String wird nach Einlesen aus Datei nicht erkannt Java Basics - Anfänger-Themen 3
M String in Scanner einlesen Java Basics - Anfänger-Themen 6
E TXT FILE EINLESEN Java Basics - Anfänger-Themen 4
M Einzelzeichen einlesen Java Basics - Anfänger-Themen 2
C (char) Array einlesen Java Basics - Anfänger-Themen 8
B HTML File einlesen inkl. Bilder? Java Basics - Anfänger-Themen 2
E Mehrere Eingabezeilen gleichzeitig einlesen Java Basics - Anfänger-Themen 7
B HTML Datei einlesen und HTML Code in String wandeln Java Basics - Anfänger-Themen 19
V Schleife für das Einlesen von Werten für int Variablen, die Bestandteil von Arrays sein sollen Java Basics - Anfänger-Themen 16
I Nur auf Abfrage von einer Text Datei einlesen Java Basics - Anfänger-Themen 11
P Text Datei einlesen und übertragen Java Basics - Anfänger-Themen 15
E Einteilung der Räume mit einlesen einer .txt datei Java Basics - Anfänger-Themen 16
P Array einlesen von Konsole Java Basics - Anfänger-Themen 8
D Eingaben in String Array einlesen Java Basics - Anfänger-Themen 12
B CSV einlesen - Parameter a) encoding b) delimiter Java Basics - Anfänger-Themen 7
R Compiler-Fehler Einlesen von Konsolenparameter funtioniert nichtmehr Java Basics - Anfänger-Themen 4
I OOP Objektnamen über die Konsole richtig einlesen Java Basics - Anfänger-Themen 9
J Einlesen von Datei funktioniert nicht Java Basics - Anfänger-Themen 8
H Einlesen Java Basics - Anfänger-Themen 8
H Einlesen von Zahlen Java Basics - Anfänger-Themen 20
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
CptK Datentypen Text Dateien einlesen Java Basics - Anfänger-Themen 3
A Datentypen Unterschiedliche Datentypen in einer Eingabe einlesen Java Basics - Anfänger-Themen 2
R txt Einlesen und Verarbeiten Java Basics - Anfänger-Themen 15
M Erste Schritte CSV-File einlesen und Daten verarbeiten Java Basics - Anfänger-Themen 5
M Datei einlesen mit Scanner funktioniert nicht (FileNotFoundException) Java Basics - Anfänger-Themen 6
K Sonderzeichen einlesen Java Basics - Anfänger-Themen 3
L Input/Output XML Datei einlesen (JAXB?) Java Basics - Anfänger-Themen 10
F Zahlen aus Datei einlesen und in Array speichern Java Basics - Anfänger-Themen 2
I Datei einlesen Java Basics - Anfänger-Themen 11
J Best Practice [Code Verbesserung] TXT einlesen und in Arrayliste speichern Java Basics - Anfänger-Themen 5
A Ungeordnetes Array ordnen, Zahl einlesen und einordnen Java Basics - Anfänger-Themen 23
R Erste Schritte Sicheres einlesen eines Strings Java Basics - Anfänger-Themen 2
MaximilianTM Input/Output Einlesen und bearbeiten einer text Datei / Zeile Java Basics - Anfänger-Themen 5
C Erste Schritte Regex - Datei einlesen und splitten Java Basics - Anfänger-Themen 4
T Input/Output Einlesen eines .txt Files nur bei gesetztem Breakpoint möglich Java Basics - Anfänger-Themen 1
L RSA Public Key einlesen Java Basics - Anfänger-Themen 0
K Datei aus unbekannten Speicherorten einlesen Java Basics - Anfänger-Themen 1
T Datei in Array einlesen "null" Java Basics - Anfänger-Themen 8
U Daten aus Datei einlesen Java Basics - Anfänger-Themen 4
J Auslesen/speichern und wieder einlesen Java Basics - Anfänger-Themen 7
N Datei Zeilenweise einlesen, Ausgabe mehrere Arrays Java Basics - Anfänger-Themen 7
B Excel File einlesen und Überschrift prüfen Java Basics - Anfänger-Themen 8
M Einlesen von Integerwertern aus einer CSV Java Basics - Anfänger-Themen 8
? Methoden Boolean Wert vergleichen und einlesen Java Basics - Anfänger-Themen 1
K String einlesen und als Variable speichern Java Basics - Anfänger-Themen 8
K .txt einlesen und in ein Array packen Java Basics - Anfänger-Themen 2
M Erste Schritte Zahlen einlesen und auswerten Java Basics - Anfänger-Themen 6
N Best Practice CSV einlesen - Variables Array?! Java Basics - Anfänger-Themen 8
O Klassen Objektnamen für Methodenaufrauf einlesen lassen Java Basics - Anfänger-Themen 2
D Array Werte einlesen und ausgeben? Java Basics - Anfänger-Themen 8
C Java Scanner einlesen von txt Dokument InputMismatch Java Basics - Anfänger-Themen 9
V Hilfe zum Thema einlesen eines Datums Java Basics - Anfänger-Themen 5
E Erste Schritte txt.Datei mit BufferedReader einlesen und in 2D-Array abspeichern Java Basics - Anfänger-Themen 15
S Werte in Array einlesen Java Basics - Anfänger-Themen 2
A Textdatei mit BufferedReader einlesen Java Basics - Anfänger-Themen 0
P Einlesen von Daten via BufferedReader Java Basics - Anfänger-Themen 4
J Zahlen aus Konsole einlesen Java Basics - Anfänger-Themen 1
P Methoden ausgelesene (CSV-) Daten in Liste einer anderen Klasse einlesen Java Basics - Anfänger-Themen 0
T Input/Output Double und String als Eingabe einlesen Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben