Csv-Datei einlesen

jono

Top Contributor
Hallo und einen guten Abend,

Ich möchte eine csv einlesen.
Aufgabe:
user.csv:
Java:
Mail,Passwort
sam@gmail.com, sfkjiwefsdkfl
totin@airbnb.com, 29sdf@s
raj@gmail.com, abc
dev@gmail.com, wild

Implementieren Sie eine statische-public Methode mit dem Namen "csvToList" in der Klasse "Functionality.java".
Die Methode bekommt als Eingabeparameter einen String und gibt eine LinkedList<String[]> zurück.
Signatur: csvToList(String path) : LinkedList<String[]>

"csvToList" liest eine CSV-Datei im path ein. Jede einzelne Zeile wird in zwei Teile geteilt. Die zwei Teile sind immer durch ein Komma getrennt. Die beiden Teile werden normalisiert, indem falls vorhandene Leerzeichen vorne und hinten entfernt werden, und in einem String-Array gespeichert. Dieses zweier-Paar im String[] wird der Liste hinzugefügt. Die Liste mit den zweier-Paaren soll zurückgegeben werden.

Ihr Algorithmus muss folgende Anforderungen erfüllen:
- Die erste Zeile soll nicht eingelesen werden, da diese nur die Spalteninformationen enthält.
- In einem String-Array sollen sich die normalisierten Einträge einer Zeile befinden.
- Die einzelnen Elemente der Zeilen sollen im String-Array keine Leerzeichen beinhalten.
- Falls bei dem Auslesen der Datei eine IOException geworfen wird, soll null zurückgegeben werden. Verwenden Sie hierfür try & catch.
- Die "user.csv" soll verarbeitet werden können.

1. Ist mit "path" einfach der primitive Datentyp path vom Typ String gemeint (der Eingabeparameter)?
2. Die Zeile wird dann ja durch die Kommata gesplittet.
3. Normalisiert werden diese dann ja durch str.trim();

Ich weiß jetzt aber nicht ganz genau, wie ich genau vorzugehen hab'. Das ist nur ein Beispiel für try/catch , mit gewissem Bezug zu der Aufgabe. Ich möchte zuerst jede einzelne Zeile in zwei Teile überführen. Dafür müss ich dann ja z.B. String[] fields = path.split(","); anwenden. Um dieses zu normalisieren, kann ich die trim();-Methode direkt hinten dranschreiben?
Und wie genau implementiere ich es so, sodass die csv-Datei erst ab 2. Zeile eingelesen wird?
 
Zuletzt bearbeitet von einem Moderator:

White_Fox

Top Contributor
1. Ist mit "path" einfach der primitive Datentyp path vom Typ String gemeint (der Eingabeparameter)?
String ist kein primitiver Datentyp, sondern eine ausgewachsene Klasse. Aber ja, davon abgesehen würde ich es so verstehen, daß path der Pfad zu einer CSV-Datei ist.

Ich möchte zuerst jede einzelne Zeile in zwei Teile überführen.
Damit zäumst du das Pferd aber an allen Ecken gleichzeitig auf. Bevor du jede Zeile zerlegst, mußt du erstmal die Datei auslesen. Am besten zeilenweise. Damit würde ich an deiner Stelle anfangen. Was du dann mit jeder Zeile machst, kannst du dir auch danach überlegen.

Nachtrag:
Es ist immer gut, ein großes Problem in kleine, leicht verdauliche Einzelprobleme zu zerlegen. Damit kann man den Grad der Komplexität, den man beherrschen kann, ganz erheblich steigern.
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Also wie Du es genau machst, ist Dir überlassen. Es gibt viele Wege. Da die Zeilennummer egal ist, wäre LineNumberReader nicht mein bevorzugter Kandidat. Aber beides wäre eine Idee - wobei Du nicht beides zusammen brauchst (Also wäre es ein oder und kein und).
 

jono

Top Contributor
Also entweder den LineNumberReader oder den BufferedReader? Habe den Unterschied zwischen beiden nicht ganz verstanden.
Würde aber auf jeden Fall von einem mit den beiden arbeiten wollen, weil wir nur diese bis jetzt kennengelernt haben.
@kneitzel
 

jono

Top Contributor
Okay.
Java:
public static LinkedList<String[]> csvToList(String path) {

        LinkedList<String[]> list = new LinkedList<String[]>();

        try {

            BufferedReader br = new BufferedReader(new FileReader(path));
            
            br.lines()
            .filter(line -> br.getLineNumber() > 1)
            .forEach(line -> {

            String[] fields = path.split(",");

            String mail = fields[0].trim();
            String password = fields[1].trim();
            String[] csv = { mail, password };

            list.add(csv);

            br.close();

            return list;

        } catch (IOException e) {   // Die geschweifte Klammer vor Catch wird rot unterstrichen
            return null;
        }
        
    }     // Und diese ebenfalls
    }
So habe ich es bis jetzt mal gemacht. Zuerst das Einlesen mit Buffered- und FileReader. Dann die Teilung jeder Zeile (ausgenommen der 1.) durch split. Dann die Normalisierung bzw. auch Trennung von Leerzeichen oder so durch trim(). Die Werte habe ich dann ja in einem String-Array gespeichert und dann der "list" hinzugefügt. Wie sieht es eurer Ansicht nach aus?
Folgende Probleme habe ich noch:
-Falls bei dem Auslesen der Datei eine IOException geworfen wird, soll null zurückgegeben werden. Verwenden Sie hierfür try & catch.
- Die "user.csv" soll verarbeitet werden können.

Diese 2 in der Aufgabe verlangten Dinge. die IOException habe ich in den catch-Block geschrieben, jedoch wird mir etwas rot unterstrichen, siehe comments. Letzteres weiß ich auch nicht genau umzusetzen.
 
K

kneitzel

Gast
Eine Frage, die sich mir direkt aufdrängt: Wieso muss es eine Stream Lösung sein?

Und dann auch gleich ein "-> {" Konstrukt?

Das ist wie jemand, der noch keine einzige Fahrstunde hat, aber dann gleich meint, er müsse mit einem Rennwagen auf einer Rennstrecke Bestzeiten fahren ...

Streams sind genial - und damit lässt sich die Aufgabe in wenigen Zeilen aufbauen. Aber Du scheiterst ja schon an der Anzahl der geschweiften Klammern!

Bau es doch einfach einmal ganz ohne irgendwelche Streams. Wenn Du das hin bekommst, dann kann man gerne eine Stream Lösung diskutieren, aber so sehe ich da keinen wirklichen Sinn drin...
 

jono

Top Contributor
Eine Frage, die sich mir direkt aufdrängt: Wieso muss es eine Stream Lösung sein?
Das liegt daran, dass ich nicht weiß, wie ich es denn sonst lösen soll.
Und dann auch gleich ein "-> {" Konstrukt?
Das habe ich übernommen, da wusste ich nicht wie ich das hätte anders machen können.
Aber Du scheiterst ja schon an der Anzahl der geschweiften Klammern!
Warum, so wie ich es gezählt habe sind es doch jeweils 4 ? ^^
 

thecain

Top Contributor
Und jetzt matche sie noch gegeneinander... Hinweis, es stimmt nicht... du machst beim foreach eine Klammer auf, die du nach der catch Klammer zu machst... das kann nicht funktionieren

Aber das müsstest du auch selber sehen.

+ der Hinweis von @kneitzel
 

jono

Top Contributor
Java:
public static LinkedList<String[]> csvToList(String path) {

        LinkedList<String[]> list = new LinkedList<String[]>();

        try {

            BufferedReader br = new BufferedReader(new FileReader(path));

            br.lines().filter(line -> br.getLineNumber() > 1).forEach(line -> {

                String[] fields = path.split(",");

                String mail = fields[0].trim();
                String password = fields[1].trim();
                String[] csv = { mail, password };

                list.add(csv);

                br.close();
            

            return list;
            });
        } catch (IOException e) {
            return null;
        }

    }
}
Und jetzt matche sie noch gegeneinander...
Habe es jetzt so gemacht, ist aber noch nicht richtig, habe es aber immer noch nicht ganz richtig gemacht.
Oder strukturiere den Code vernünftig, so dass du mehrere Methoden hast, die alle für sich übersichtlich sind ...
Mit mehreren Methoden würde mir das jetzt noch zu schwer fallen. Wüsste da jetzt nicht, wie ich das so aufteilen sollte. Habe das aber jetzt verstanden, dass man die Blöcke richtig aufteilen muss. Normal sollte es jetzt so passen, weiß nur nicht warum es noch nicht funktioniert...
 
K

kneitzel

Gast
Weil es so halt nicht passt. Kann es sein, dass Du im Augenblick nur rätst? Einfach etwas rumbasteln, bis der Compiler / die IDE nicht mehr meckert?

Wenn Du Streams nicht verstehst, dann nutze diese schlicht nicht. Also:
Schmeiß den Lamba Ausdruck und den Stream weg! Mach es auf eine Art und Weise, bei der Du eine Chance hast, zu verstehen, was dein Code macht!
 

LimDul

Top Contributor
Java:
public static LinkedList<String[]> csvToList(String path) {

        LinkedList<String[]> list = new LinkedList<String[]>();

        try {

            BufferedReader br = new BufferedReader(new FileReader(path));

            br.lines().filter(line -> br.getLineNumber() > 1).forEach(line -> {

                String[] fields = path.split(",");

                String mail = fields[0].trim();
                String password = fields[1].trim();
                String[] csv = { mail, password };

                list.add(csv);

                br.close();
           

            return list;
            });
        } catch (IOException e) {
            return null;
        }

    }
}

Habe es jetzt so gemacht, ist aber noch nicht richtig, habe es aber immer noch nicht ganz richtig gemacht.

Mit mehreren Methoden würde mir das jetzt noch zu schwer fallen. Wüsste da jetzt nicht, wie ich das so aufteilen sollte. Habe das aber jetzt verstanden, dass man die Blöcke richtig aufteilen muss. Normal sollte es jetzt so passen, weiß nur nicht warum es noch nicht funktioniert...
Nein ist nicht richtig. Ist dir überhaupt klar was forEach macht? Im foreach schließt du den buffered Reader. Ich glaube nicht, das das sinnvoll ist. Außerdem steht da ein return drin - das heißt du brichst sofort ab.
 
K

kneitzel

Gast
Nein ist nicht richtig. Ist dir überhaupt klar was forEach macht? Im foreach schließt du den buffered Reader. Ich glaube nicht, das das sinnvoll ist. Außerdem steht da ein return drin - das heißt du brichst sofort ab.
Das ist ja nur rumgebastelt, dass die IDE nicht mehr schimpft. Aber was macht er denn in dem forEach? path.split? Was ist den path?

Vor allem ist das eigentlich nur ein Stream, der alles in dem forEach macht. Also etwas, das man als Anti-Pattern bezeichnen würde (so man Effective Java heranziehen würde ... da ist das ein Punkt meine ich, wobei ich den jetzt nicht raussuchen werde). Das wäre einfach eine Schleife in einen Stream umgewandelt ...

Eine funktionale Lösung würde also überlegen, was da überhaupt notwendig ist:
- filter ist prinzipiell ok. Aber da würde ich einfach hingehen und Files.lines(Path) verwenden. Dann wäre das filter ein einfaches skip(1)
- Dann würde man Zeilen umwandeln in ein String[] - das kann in einer separaten Methode erfolgen und man gibt dann eine Methodenreferenz an. Aber String ist mächtig genug: split nimmt ja einen regulären Ausdruck ... Also wäre das einfach nur zwei Aufrufe hintereinander was man schön als einen Lambda Ausdruck schreiben kann.
- Am Ende dann das sammeln in einer LinkedList: collect(Collectors.toCollection(...))
Das wäre der funktionale / Stream Ansatz.
@jono Das ist aber etwas, das Du nicht verstehst (was auch ok ist!) und was Du nicht verwenden sollst.

Wie liest Du eine Datei Zeile für Zeile und gibst nur die Zeile aus? Fang doch einfach einmal damit an.
 

jono

Top Contributor
Wie liest Du eine Datei Zeile für Zeile und gibst nur die Zeile aus? Fang doch einfach einmal damit an.
Wir haben nur den BufferedReader dazu kennengelernt, also es wurde nicht explizit gesagt, dass man etwas damit einlesen kann, aber der steht in den Folien unter try und catch Anwendungen. Ich habe wirklich keine Ahnung wie es sonst geht.
 

jono

Top Contributor
Das erste Thema ist
Grundlagen Programmierung
2. String u. Arrays
3. Suchen und Sortieren
4. Rekursive Funktionen + Vor- und Nachbedingungen
5. Objektorientierung + Container
6. Implementation von Klassendiagrammen
7. Ausnahmebehandlung und der Rest steht noch aus. In diesen Themenblöcken kommt da aber nichts dazu vor.
 
K

kneitzel

Gast
Ok, so langsam verstehe ich. Da vom BufferedReader nichts groß mitgegeben wurde, bist Du prompt über das lines() gestolpert. Daher diese Stream Lösung...

Schau Dir mal die folgende Methode an:

Schaffst Du damit, alle Zeilen einer Datei nacheinander einzulesen?

Dann wärst Du von den Streams weg.
 

jono

Top Contributor
Schaffst Du damit, alle Zeilen einer Datei nacheinander einzulesen?
Ich denke schon, die Beschreibung ist etwas "kompliziert" formuliert. Würde jetzt eher dahin tendieren, die Methode von thecain zu benutzen. Weil dort halt steht, liest alle Zeilen einer Datei ein.
Ein Beispiel für die Anwendung der Methode wäre sehr hilfreich. Im Netz habe ich jetzt nicht so das Passende recherchieren können. Bzw. wusste einfach nicht genau weiter.
Java:
LinkedList<String[]> list = Files.readAllLines(Paths.get(filename, Charset cs));
In etwa so?
 
K

kneitzel

Gast
Dann schau aber erst einmal, was da die Rückgabe ist bzw. probiere es mal aus um zu sehen, was der Compiler so dazu sagt... Denn das, was da zurück kommt, kannst Du so nicht in einer Variable speichern.

Achte einfach einmal auf den Typ der Rückgabe - was liefert die Methode readAllLines zurück? Steht da LinkedList<String[]> als Rückgabetyp? Oder steht da was anderes?
 

jono

Top Contributor
Der Typ der Rückgabe ist nur eine "einfache" String-Liste, deshalb sollte ich nicht mit einer LinkedList zuerst arbeiten sondern erst mit einer String-Liste. Die Werte von der String-Liste müssten dann in ein String-Array überführt werden, dessen Elemente dann in die LinkedList<String>, die ich ja initialisiert habe, returnt werden. Aber letzerer Satz spielt ja jetzt noch keine Rolle.
Java:
List<String> list = Files.readAllLines(Paths.get(filename, StandardCharsets.UTF_8));
 
K

kneitzel

Gast
Also erst einmal richtig: Es wird ein List<String> zurück gegeben. Daher verändern wir den Code erst einmal entsprechend:
Java:
List<String> list = Files.readAllLines(Paths.get(filename, Charset cs));

Nun hast Du eine List mit den ganzen Zeilen.

Für den Zugriff muss man nun wissen, was List ist: List ist ein Interface, das eine Reihe an Methoden bereit stellt:
Uns interessieren jetzt aber erst einmal size und get.

Kannst Du jetzt mit dem Wissen (ggf. mit Lesen der Details der Methoden) eine Schleife schreiben, die erst einmal alle Zeilen aus der Liste mit Ausnahme der ersten Zeile (die sollen wir ja ignorieren) ausgibt?
 

jono

Top Contributor
Verstehe die Methoden. Jedoch weiß ich jetzt nicht wo ich die zwei Interfacemethoden einzufügen habe, erschließt sich mir nicht ganz...
 
K

kneitzel

Gast
Wie liest Du eine Datei Zeile für Zeile und gibst nur die Zeile aus? Fang doch einfach einmal damit an.
Gehen wir zu dem Punkt zurück....

Du hast bisher das Lesen der Zeilen der Datei. Aber jetzt willst Du Zeile für Zeile ausgeben.

Wir wollen den Code ja ganz langsam zusammen stellen - Schritt für Schritt. Und das Zitat gibt immer noch den ersten Schritt an.

Somit schau mal, wie Du den Code nun erweitern kannst. Bisher haben wir nur:
Java:
List<String> list = Files.readAllLines(Paths.get(filename));
 

jono

Top Contributor
Im Prinzip will ich ja irgendwas wie : Ist jetzt mal rein intuitiv:
Java:
List<String> list = Files.readAllLines(Paths.get(filename));
list.get(list.size(> 1));
Das ist natürlich nicht richtig, mir fehlt aber jetzt der Ansatz bzw. halt der genau Code, Intuitives bringt mich ja dann nicht mehr weiter.
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Du machst seid über einem Jahr Java. Du wirst doch in der Lage sein, in einer Schleife ein Array oder eine Liste durchzugehen, oder? Das wird doch schon öfters notwendig gewesen sein in den letzten Monaten. Und das wäre das Gleiche - ob Du auf Element nun über ein Array-Operator ( [index] ) zugreifst oder über eine Methode ( get(index) ) - das ist ja egal, denn das Prinzip ist ja beides Mal identisch.

Aber hier wäre es mir egal gewesen, wie Du das generell gemacht hättest: for, for-each, iterator mit while ... von mir aus Streams (Bitte nicht, aber das war ja etwas, das Du etwas gestartet hattest ursprünglich in diesem Thread) - es hätte extrem viele Möglichkeiten gegeben. Jede wäre ok gewesen...

Das wären dann so eine kleine Anzahl an Optionen - wobei ich in dem Beispiel die List<String> lines genannt habe. Es ist eine List, aber wir benennen den Inhalt und nicht den Typ. Daher: Da sind die Zeilen drin, also "lines":

Java:
for (int index = 0; index < lines.size(); index++)
    System.out.println(lines.get(index));


for (String line: lines)
    System.out.println(line);


ListIterator<String> iterator = lines.listIterator();
while (iterator.hasNext())
    System.out.println(iterator.next());



Stream.of(lines).forEach(line -> System.out.println(line));


Stream.of(lines).forEach(System.out::println);

Das nur um paar Optionen zu zeigen - wobei ich mich über die erste Option am meisten gefreut hätte - denn einfach bei 1 anfangen statt bei 0 und schon hätten wir die erste Zeile ausgelassen. Aber das ginge bei den anderen Lösungen auch alles ... Bei for-each hätte man ggf. eine boolsche Variable skipped, die man auf false setzt und dann hat man in der Schleifer erst ein if (!skipped) { skipped = true; continue: }. Oder bei dem iterator macht man vor die Schleife einen next() Aufruf. Oder bei den Streams kommt ein ".skip(1)" dazu .... Also alles kein Thema ...

Nur wie gesagt: irgend einen Weg mit den schleifen musst Du kennen. Die grundlegenden Java Konstrukte sind eine absolute Basis ohne die wir hier nicht weiter kommen können ...
 

mihe7

Top Contributor
Vielleicht kann @jono einfach mal einen passenden Algorithmus in "Alltagssprache" formulieren, also jeden Schritt beschreiben, ohne Java zu verwenden?
 
K

kneitzel

Gast
Kleine Verbesserung - da ist mir beim Schreiben der Code Beispiele ein Fehler unterlaufen:
Stream.of(lines) ist natürlich falsch. Das Stream.of nimmt ein Array (varargs Parameter).
Collection hat die Methode stream, d.h. die Streams starten natürlich mit lines.stream()

Ist mir leider jetzt erst aufgefallen, als ich es beim Lesen von der neuesten Antwort nochmal gesehen habe ... Sowas passiert leider, wenn man direkt im Forum schreibt und nicht in einer IDE.
 

jono

Top Contributor
Schleifen zu kennen ist ja auch definitiv zuviel verlangt
Nein, das nicht. Aber ich habe nicht gewusst, dass man eine Schleife auch auf eine Liste anwenden kann auch wenn es Sinn macht, das war das Problem.
for (int index = 0; index < lines.size(); index++) System.out.println(lines.get(index));
Diese würde mir dann am ehesten zusagen. Hätte ich auch gewählt.

Jetzt:
Die zwei Teile sind immer durch ein Komma getrennt. Die beiden Teile werden normalisiert, indem falls vorhandene Leerzeichen vorne und hinten entfernt werden, und in einem String-Array gespeichert.
split(); wäre zuerst angesagt + trim(); und dann das Speichern in einem String-Array. Wie schaffe ich das jetzt besonders mit dem String-Array, die Frage stellt sich mir jetzt noch vor allem.
 

jono

Top Contributor
Vielleicht kann @jono einfach mal einen passenden Algorithmus in "Alltagssprache" formulieren, also jeden Schritt beschreiben, ohne Java zu verwenden?
"csvToList" liest eine CSV-Datei im path ein. Jede einzelne Zeile wird in zwei Teile geteilt. Die zwei Teile sind immer durch ein Komma getrennt. Die beiden Teile werden normalisiert, indem falls vorhandene Leerzeichen vorne und hinten entfernt werden, und in einem String-Array gespeichert. Dieses zweier-Paar im String[] wird der Liste hinzugefügt. Die Liste mit den zweier-Paaren soll zurückgegeben werden.

Sprich: Das Einlesen ist ja schon "festgelegt". Eine Liste soll erstellt werden, um die Zeilen auszulesen und darin zu speichern. Von diesen Zeilen: Gebe nur die Zeilen ab dem Index 1 aus,
Nun: Teile jede Zeile in zwei Teile; Trennung liegt beim Komma.
trim(); und split(); weiß ich gerade noch nicht ganz anzupassen. Und am Ende soll dann natürlich noch das String-Array returnt werden, was ja auch geht, weil die der Rückgabetyp ausschließlich String-Arrays enthält.
 
K

kneitzel

Gast
Dann schreib als nächstes eine Methode, die eine Zeile als Parameter bekommt und die genau dies mit der Zeile macht, was Du beschrieben hast.
 

jono

Top Contributor
Java:
public static String[] manipulation(List<String[]> lines) {
        String[] array = new String[lines.size()];

        for (int i = 1; i < lines.size(); i++) {
            array[i].trim().split(",");
        }
        return array;
    }
So in etwa?
 
K

kneitzel

Gast
Nein, die Methode soll eine Zeile bekommen - das wäre also nur ein String. Und der Code so sieht auch nicht wirklich brauchbar aus ...
 

jono

Top Contributor
Java:
    public static String[] manipulation(String lines) {
        List<String> csv = new ArrayList<String>();
        String[] array = new String[csv.size()];

        for (lines: csv) {
            lines.trim().split(",");
        }
        return array;
    }
So? War zu eilig, muss ja jetzt noch schauen, wie ich die lines dem array hinzufüge...
 
K

kneitzel

Gast
Sag erst einmal mit Worten, was du jetzt genau machen willst.

Du hast eine Zeile als Parameter - was wird damit weiter gemacht?
 

jono

Top Contributor
Dieser Parameter "String lines" soll jetzt in die Liste gehen, die jede Zeile einliest. So soll Zeile für Zeile normalisiert und geteilt werden.
Also ich möchte mit lines vom Typ String die Liste durchgehen und jede Zeile ab index 1 durch "," trennen und durch trim() normalisieren.
 
Zuletzt bearbeitet:

jono

Top Contributor
Java:
public static String[] manipulation(String lines) {
        List<String> csv = new ArrayList<String>();
        String[] array = new String[csv.size()];

        for (int index = 1; index ++) {
            array = lines.trim().split(",");
        }
        return array;
Das habe ich bis jetzt mal aufgeschrieben.
Oder sollte ich schreiben: index < array.length; Problem liegt auch darin, die Zeilen der List ins String-Array zu übertragen.
 
Zuletzt bearbeitet:

jono

Top Contributor
Warum gibst du auf? Du hast noch nicht einen sinnvollen Beitrag geleistet. Außer 2 Stk. die mir nichtmal weitergeholfen haben, weil mir dann ja doch (sinnvollerweise) abgeraten worden ist das auf diesem Wege zu tun. Also hast du im Prinzip von Anfang an aufgegeben, gib mir doch einfach Hilfestellung anstatt mir so etwas an den Kopf zu knallen oder lass das Kommentieren einfach sein... Was soll mir deine Aussage jetzt bringen?
Bzw. dein Verweis auf den Link. Aber sowas muss auch nicht sein. Meine aus deiner Sicht und der anderen Laienfragen sind ja meinetwegen trivial, aber wenn ich doch nicht weiterkomme, vorallem eine Aufgaben von dem Typ habe ich noch nie gemacht bzw. versucht. Natürlich spielt hier das Wissen von anderen Grundlagen viel mit rein, aber nur weiß ich nichtmal wie ich die Lines ins Array gespeichert bekomme und wie genau ich die lines in diesem trenne mir ist noch nicht klar, was genau da verlangt ist. Ich möchte in der manipulation-Methode doch einfach nur lines im String array speichern. Deshalb fällt es mir einfach noch schwer mit der Aufgabe.
 
Zuletzt bearbeitet:

mihe7

Top Contributor
"csvToList" liest eine CSV-Datei im path ein. Jede einzelne Zeile wird in zwei Teile geteilt. Die zwei Teile sind immer durch ein Komma getrennt. Die beiden Teile werden normalisiert, indem falls vorhandene Leerzeichen vorne und hinten entfernt werden, und in einem String-Array gespeichert. Dieses zweier-Paar im String[] wird der Liste hinzugefügt. Die Liste mit den zweier-Paaren soll zurückgegeben werden.

Sprich: Das Einlesen ist ja schon "festgelegt". Eine Liste soll erstellt werden, um die Zeilen auszulesen und darin zu speichern. Von diesen Zeilen: Gebe nur die Zeilen ab dem Index 1 aus,
Nun: Teile jede Zeile in zwei Teile; Trennung liegt beim Komma.
trim(); und split(); weiß ich gerade noch nicht ganz anzupassen. Und am Ende soll dann natürlich noch das String-Array returnt werden, was ja auch geht, weil die der Rückgabetyp ausschließlich String-Arrays enthält.
Die Ideen an sich sind ja nicht verkehrt, aber da ist zu viel Chaos drin.

Also, gehen wir mal davon aus, dass die Zeilen der Datei schon in eine Liste eingelesen wurden. Gesucht ist jetzt ein Algorithmus, der eine String-Liste (List<String>) als Parameter bekommt und eine String-Array-List (List<String[]>) zurückliefert, wobei die übergebenen Zeilen nach den gegebenen Regeln transformiert werden sollen.

Unter einem Algorithmus in Alltagssprache verstehe ich etwas wie

Code:
Algorithmus konvertiere(zeilen : String-Liste)

Sei ergebnis eine neue Liste zur Aufnahme von String-Arrays
Sei n die Anzahl der Elemente in Liste zeilen minus 1
Wiederhole i von 1 bis n
    Sei zeile das Element in zeilen mit Index i, also das (i+1)-te Element aus zeilen
    Sei zerlegung das String-Array, das zerlege(zeile) zurückliefert
    Füge zerlegung zu ergebnis hinzu
Gib ergebnis zurück

Der Algorithmus zerlege muss nun nur noch dafür sorgen, dass eine Zeile in seine Teile zerlegt wird und die Teile normalisiert werden. Das wirst Du ja selbst hinbekommen.

Anschließend übersetzt Du den Spaß nach Java und bist so gut wie fertig.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
M Daten aus .txt Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 80
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
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
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
CptK Richtigen Pfad beim einlesen von Datei finden Java Basics - Anfänger-Themen 2
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
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
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
B HTML Datei einlesen und HTML Code in String wandeln Java Basics - Anfänger-Themen 19
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
J Einlesen von Datei funktioniert nicht Java Basics - Anfänger-Themen 8
M Datei einlesen mit Scanner funktioniert nicht (FileNotFoundException) Java Basics - Anfänger-Themen 6
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
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
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
N Datei Zeilenweise einlesen, Ausgabe mehrere Arrays Java Basics - Anfänger-Themen 7
E Erste Schritte txt.Datei mit BufferedReader einlesen und in 2D-Array abspeichern Java Basics - Anfänger-Themen 15
M Methoden Datei einlesen und als return übergeben. Java Basics - Anfänger-Themen 8
P CSV Datei einlesen und damit ein Datenmodell befüllen Java Basics - Anfänger-Themen 2
N Datei einlesen und grafisch anzeigen Java Basics - Anfänger-Themen 31
P csv Datei einlesen und ausgeben Java Basics - Anfänger-Themen 5
J Text Datei einlesen Java Basics - Anfänger-Themen 6
N gerichteter Graph aus einer Datei einlesen Java Basics - Anfänger-Themen 21
E Datei einlesen und bestimmte Wörter ausgeben Java Basics - Anfänger-Themen 2
Z Erste Schritte Versuche ein Labyrinth in einem Terminal zu erstellen, aber kann die properties Datei nicht einlesen Java Basics - Anfänger-Themen 3
J Encoding Problem beim Einlesen einer txt Datei mit Umlauten Java Basics - Anfänger-Themen 3
V Excel Datei einlesen und verarbeiten Java Basics - Anfänger-Themen 4
stylegangsta Input/Output Hat eclipse eine Macke oder mein Code Array Datei einlesen Java Basics - Anfänger-Themen 5
N Mehrdimensionales float Array aus .txt-Datei einlesen? Java Basics - Anfänger-Themen 17
C Datei mit Daten einlesen und höchsten wert der zweiten Spalte ermitteln Java Basics - Anfänger-Themen 1
J CSV Datei einlesen und verarbeiten Java Basics - Anfänger-Themen 10
I BufferedReader Text-Datei einlesen??? Java Basics - Anfänger-Themen 1
S Datei einlesen - Dateipfad unter Linux anpassen Java Basics - Anfänger-Themen 12
A Datei in Array einlesen Java Basics - Anfänger-Themen 6
S Daten aus anderen Dateien in neue Datei einlesen Java Basics - Anfänger-Themen 3
Ananaskirsche Input/Output Bestimmte Zeile aus Datei einlesen Java Basics - Anfänger-Themen 4
J .txt Datei "einlesen "und in String speichern ergibt immer NULL Java Basics - Anfänger-Themen 17
M CSV-File aus datei system einlesen Java Basics - Anfänger-Themen 3
B Datei in Java einlesen Java Basics - Anfänger-Themen 13
S Datei einlesen und ausgeben Java Basics - Anfänger-Themen 8
S Input/Output einlesen aus einer evtl. leeren Datei Java Basics - Anfänger-Themen 5
J Input/Output Datei - Zeilenumbruch einlesen Java Basics - Anfänger-Themen 10
H config Datei erstellen + einlesen Java Basics - Anfänger-Themen 15
F Datei einlesen ( Bytes ) Java Basics - Anfänger-Themen 12
T Klassen CSV datei einlesen und parsen Java Basics - Anfänger-Themen 4
U Datei einlesen Java Basics - Anfänger-Themen 9
S ANSI-Datei einlesen UND UTF-8-Datei schreiben Java Basics - Anfänger-Themen 3
M Datei einlesen mit generics? Java Basics - Anfänger-Themen 9
I Datei einlesen, Inhalt in MAP ablegen Java Basics - Anfänger-Themen 10
A Erste Schritte Datei einlesen und Buchstaben zählen Java Basics - Anfänger-Themen 13
D txt-Datei zeilenweise als String einlesen Java Basics - Anfänger-Themen 2
E JPane txt datei einlesen Java Basics - Anfänger-Themen 5
D RegExp .txt-Datei einlesen Java Basics - Anfänger-Themen 6
M Datei Einlesen Fortan-Style? Java Basics - Anfänger-Themen 3
A Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 5
S Datei einlesen Java Basics - Anfänger-Themen 21
D Datei einlesen Fehler Java Basics - Anfänger-Themen 17
A Beim txt Datei einlesen kommen zusätzliche Lehrzeichen dazu. Java Basics - Anfänger-Themen 5
H eine Datei schnellstmöglich einlesen Java Basics - Anfänger-Themen 12
0 Log4J Probleme beim einlesen der Log datei Java Basics - Anfänger-Themen 2
E Input/Output Linux datei in Windows zeilenweise einlesen Java Basics - Anfänger-Themen 4
S XML Datei einlesen und Elemente ausgeben Java Basics - Anfänger-Themen 4
L Problem beim Einlesen einer Datei in einen String Java Basics - Anfänger-Themen 12
S Datenströne - Text in eine Datei einlesen, umwandeln und in eine neue Datei schreiben Java Basics - Anfänger-Themen 6
E externe .txt Datei mit Scanner einlesen Java Basics - Anfänger-Themen 7
N Input/Output .txt-Datei einlesen, aufteilen und seperat abspeichern Java Basics - Anfänger-Themen 3
L Datei einlesen Java Basics - Anfänger-Themen 12
L Input/Output Datei in Java einlesen Java Basics - Anfänger-Themen 9
J Datei einlesen Java Basics - Anfänger-Themen 10
I .csv-Datei einlesen klappt aber kann nicht in String geschrieben werden!?!?! Java Basics - Anfänger-Themen 11
S Datei einlesen und Ergebnis wieder in Datei schreiben Java Basics - Anfänger-Themen 5
J Datei einlesen teile aus lines ändern und wieder rausschreiben. Java Basics - Anfänger-Themen 4
B Wertetabelle mit versch. Formaten aus txt-Datei einlesen Java Basics - Anfänger-Themen 2
H 200000 Zeilen aus Datei einlesen Java Basics - Anfänger-Themen 13
D CSV Datei einlesen und verarbeiten Java Basics - Anfänger-Themen 23
J byteweise Einlesen einer Datei "Von.. bis.." Java Basics - Anfänger-Themen 3
J Einlesen/Speichern von Strings aus einer Datei Java Basics - Anfänger-Themen 15
Z CSV-Datei einlesen mit dem JFileChooser !!! Java Basics - Anfänger-Themen 5
H Einlesen einer CSV-Datei Java Basics - Anfänger-Themen 2
X einlesen aus Datei, Fehler Java Basics - Anfänger-Themen 9
S Einlesen einer Datei? Java Basics - Anfänger-Themen 9
L Datei einlesen und neu geändert ausgeben Java Basics - Anfänger-Themen 8
B Formel aus Datei einlesen und benutzen Java Basics - Anfänger-Themen 3
C Datei einlesen Java Basics - Anfänger-Themen 19
H Datei einlesen in einer MVC Anwendung Java Basics - Anfänger-Themen 3
M OutOfMemoryError beim Datei einlesen Java Basics - Anfänger-Themen 17

Ähnliche Java Themen

Neue Themen


Oben