# Zeilen in Array einlesen und splitten?



## coldstone (7. Apr 2016)

Kann ich mit der split methode Zeilen in ein array einlesen?


Mein code sieht so aus:


```
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Grep {
 

      public static void main(String[] args) throws IOException
      {
   
            BufferedReader br = new BufferedReader(new FileReader("C:/test.txt"));
             
            String zeile;
            while( (zeile = br.readLine()) != null )
            {
            String[] teilen = zeile.split(" ");
            System.out.print(teilen[2]);
         
            }
            br.close();     
      }
}
```

So gibt er mir immer die richtigen Zeilen aus, aber ohne leerzeichen zwischen den Wörtern.

```
ichbineinetestzeile
```

Welchen Ausdruck muss ich hier verwenden? 

```
...zeile.split(" ");
```


----------



## Schesam (8. Apr 2016)

Der Ausdruck stimmt. Du splittest die Zeile an den Leerstellen. Allerdings werden diese leerstellen dabei entfernt. Möchtest du sie weider ausgeben mach das Sout so : System.out.print(teilen[2] + " ");


----------



## Joose (8. Apr 2016)

Außerdem gibst du mit diesem Code immer nur den Teil von der 3.Stelle deiner Zeile aus, nicht die komplette Zeile!


----------



## Xyz1 (8. Apr 2016)

So könnte es funktionieren:

```
public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new StringReader("eins zwei drei\nneun"));
        String zeile;
        while ((zeile = br.readLine()) != null) {
            String[] teilen = zeile.split(" ");

            for (String t : teilen) {
                System.out.println(t);
            }
            System.out.println("");
        }
        br.close();
    }
```

oder so

```
public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new StringReader("eins zwei drei\nneun"));
        String zeile;
        while ((zeile = br.readLine()) != null) {
            String[] teilen = zeile.split(" ");

            for (String t : teilen) {
                System.out.print(t + " ");
            }
            System.out.println("");
        }
        br.close();
    }
```

Ein paar Sachen bei vermeiden, aber für den Anfang, reicht das.

Beim Pfad brauchst du übrigens \\ (zwei Backslashes).


----------



## coldstone (8. Apr 2016)

Joose hat gesagt.:


> Außerdem gibst du mit diesem Code immer nur den Teil von der 3.Stelle deiner Zeile aus, nicht die komplette Zeile!



Stimmt, der speichert jedes 1. oder 2. usw. Wort in ein array. Gibt es denn keinen Ausdruck der die komplette Zeile in ein array speichert?


```
...zeile.split(" ");
```
 ???


----------



## Jardcore (8. Apr 2016)

Auf Basis von DerWissende, kannst du dir eine Liste erstellen und dort deine Zeilen einfügen.

```
List<String> zeilen = new ArrayList<String>();
while((zeile= br.readLine())!=null){
    zeilen.add(zeile);
}
```
Du kannst wenn du unbedingt ein Array möchtest, die ArrayList wieder in ein Array umwandeln.


----------



## Joose (8. Apr 2016)

coldstone hat gesagt.:


> Stimmt, der speichert jedes 1. oder 2. usw. Wort in ein array. Gibt es denn keinen Ausdruck der die komplette Zeile in ein array speichert?


So ganz verstehe ich deine Aussage nicht.
In deinem Code (vom 1.Post) bekommst du als Rückgabewert von der Methode `split(...)` ein String[] mit allen Werten deiner eingelesenen Zeile.
Im `System.out.println(..)` gibst du aber nur einen bestimmten Wert aus dem Array aus.

Sprich deine komplette Zeile ist dann in der Variable "teilen" als String[] gespeichert. Was du dann weiter damit machst bleibt dir überlassen.


----------



## coldstone (8. Apr 2016)

@Joose


```
String[] teilen = zeile.split(" ");
```

Naja dadurch ich in der 
	
	
	
	





```
.....split(" ")....
```
 Methode einen Leerzeichen Ausdruck habe Splittet er ja nach jedem Leerzeichen und speichert es in das array.

Also als Bsp.:

```
1. Zeile:  Ich habe heute meine Arbeit erledigt.
2. Zeile:  Wir fahren in den Urlaub.
3. Zeile:  Heute habe ich frei.
4. Zeile:  Morgen sehen wir uns wieder.
```

Mein Java-Code im ersten Beitrag liest immer das erste Wort und weil danach ein leerzeichen folgt,
wird es im  index[0] gespeichert. Und das für Zeile für zeile. So dass bei index[0] folgendes ausgegeben wird:
 IchWirHeuteMorgen.
Und bei index[1] immer das zweite Wort der jeweiligen Zeile.
habefahrenhabesehen usw.

Ich will aber dass bei index[0] die ganze Zeile ausgegeben wird, nämlich
 Ich habe heute meine Arbeit erledigt.

Ich überlege die ganze Zeit was zwischen den Gänsefüsschen stehen muss, damit er bei Zeilenende splittet.

```
.....split(" ")....
```
Finde aber leider nichts. Vielleicht gibt es ja auch keinen Ausdruck der das Zeilenende ausdrückt.

```
.....split("\n")....
```
 habe ich schon versucht aber geht auch nicht.


----------



## Joose (8. Apr 2016)

coldstone hat gesagt.:


> Ich will aber dass bei index[0] die ganze Zeile ausgegeben wird, nämlich
> Ich habe heute meine Arbeit erledigt.



Du liest doch schon zeilweise ein oder? Warum splittest du dann überhaupt?


coldstone hat gesagt.:


> Finde aber leider nichts. Vielleicht gibt es ja auch keinen Ausdruck der das Zeilenende ausdrückt.
> 
> ```
> .....split("\n")....
> ...


`\n` ist schon richtig.
Aber die Methode `split` erwartet ein Regex und "\" wird in Regex zum Escapen verwendet. Damit du das "\" als Teil des Zeilenumbruchs verwenden kannst musst du es selber escapen. -> `\\n`

Aber generell: Du liest schon Zeilenweise ein. Daher sehe ich keinen Sinn mehr darin split zu verwenden.


----------



## coldstone (8. Apr 2016)

Wie kann ich denn jede Zeile einzeln in ein array speichern, sodass ich bei index[0] 1. Zeile habe und bei index[2] die dritte Zeile?


----------



## Joose (8. Apr 2016)

coldstone hat gesagt.:


> Wie kann ich denn jede Zeile einzeln in ein array speichern, sodass ich bei index[0] 1. Zeile habe und bei index[2] die dritte Zeile?



Hm ... so ganz verstehe ich nicht wo das Problem liegt.
Du hast doch schon eine String Variable welche deine ganze Zeile enthält. Diese musst du halt in ein Array legen.

Achtung: Wenn du die Zeilen wirklich in ein Array speichern willst, dann wirst du nicht darum herum kommen die Datei 2x zu lesen.
Beim ersten Mal schaust du nach wieviele Zeilen deine Datei hat und legst ein Array mit passender Größe an.
Beim zweiten Mal liest du die Zeilen und schreibst sie ins Array.

Alternative: Du verwendest eine Liste, da diese keine vorgegebene Größe braucht sondern mitwächst.

EDIT: Weitere Alternative: Du liest die komplette Datei auf einmal und teilst den erhaltenen String beim Zeilenumbruch.
Wie du eine Datei auf einmal liest zeigt dir dieser Link: http://stackoverflow.com/questions/14169661/read-complete-file-without-using-loop-in-java



coldstone hat gesagt.:


> Kann ich mit der split methode Zeilen in ein array einlesen?


Nein. Warum? -> Die split Methode teilt einen String bei dem vorgegeben Zeichen.


----------



## coldstone (8. Apr 2016)

Joose hat gesagt.:


> Beim zweiten Mal liest du die Zeilen und schreibst sie ins Array.



Das ist halt mein Problem. Wie lese ich jede zeile einzeln? 


```
String zeile;
            while( (zeile = br.readLine()) != null )
            {
         
            System.out.println(zeile);
           
            }
```

Weil das alleine gibt mir ja den gesamten Text aus.
Irgendwie geht bei mir die Lampe in der Birne nicht an.


----------



## Schesam (8. Apr 2016)

br.readLine(); Gibt dir die gesamte Zeile an, nicht den gesamten Text. Heißt, wenn die Methode dir den gesamten Text eingibt, dann sind keine Zeilenumbrüche vorhanden


----------



## Joose (8. Apr 2016)

Und um Schesam zu ergänzen: Die Schleife + das System.out.prinltn sorgen dafür das jede einzeln eingelesene Zeile auf der Konsole ausgegeben wird.
Am Ende steht auf der Konsole zwar der gesamte Text, er wurde aber nur Zeile für Zeile eingelesen und auch nur Zeile für Zeile auf die Konsole geschrieben.


----------



## coldstone (8. Apr 2016)

OK. Verstehe ich das richtig, dass ich gezielt Zeilen einzeln nicht ausgeben kann?

Also zB. nur die Zeile 3 oder Zeile 4?


----------



## Schesam (8. Apr 2016)

Klar, du kannst dir ja auch jede Zeile in ne Liste schreiben und danach mit dem Index die Zeilen rauspicken:


```
List<String> liste = new ArrayList<>();
        try {
            BufferedReader br = new BufferedReader(new FileReader("test.txt"));
            String zeile;
            while ((zeile = br.readLine()) != null) {
                liste.add(zeile);
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
       
        System.out.println(liste.get(2));
        System.out.println(liste.get(3));
```

Btw, wenn du System.out.println(); schreibst, siehst du auf der Konsole nach der Zeile auch den Zeilenumbruch, ansonsten würden sie direkt hintereinander ausgegeben werden, also ohne das ln.


----------



## Joose (8. Apr 2016)

coldstone hat gesagt.:


> OK. Verstehe ich das richtig, dass ich gezielt Zeilen einzeln nicht ausgeben kann?



Doch natürlich geht das.

Mit deinem Code liest du deine Datei zeilenweise (sprich Zeile für Zeile) ein.
Anmerkung: Enthält deine Datei aber keine Zeilenumbrüche so befindet sich natürlich der ganze Text in einer Zeile

Mit `br.readLine()` wird von der aktuellen Leseposition bis zum nächsten Zeilenumbruch gelesen.


----------



## coldstone (8. Apr 2016)

OK, jetzt gehen mehrere Lampen auf.


----------

