# Problem Dateiarbeit: split und trim



## munay (12. Okt 2007)

Hallo,

ich will innerhalb einer Methode einen Datensatz aus einer Datei auslesen. Diese Datei besteht aus 2 Kopfzeilen. Danach folgen 100 Zeilen mit jeweils 5 Spalten, welche eingelesen werden sollen. Die Daten sind durch Leerzeichen getrennt und bestehen aus double werten. Es kann sein, dass die Anzahl dieser Leerzeichen variiert. Genau da liegt auch mein Problem: Füge ich in meinen Datensatz an beliebiger Stelle eine Spalte mit Leerzeichen ein, ist meine ArrayList auf einemal doppelt so lang un dich kanns mir nicht erklären. Aber hier erstmal der code:


```
private void readDataFromFile() throws IOException {
	RandomAccessFile file;
	String line;
	String[] result;
	double[] entry;
	int i =0, col=0 ;
	// Datei zum Lesen öffnen:
	file=new RandomAccessFile(datname, "r");			
	//Zeilenweises abarbeitender Datei:
	while ((line = file.readLine()) != null) {	
	    // entry soll Daten einer Zeile enthalten:
	    entry=new double[4];	
	    // Einlesen der 2 Kopfzeilen:
	    if (i<=1){
		header[i]=line;
	    }
	    //Daten stehen in den Zeilennummern:
	    if (i>1 && i<102){
		//Aufteilen einer Zeile in ein Array von Strings:
		result =line.split("\\s");
		col=0;
		for (int j=0; j<result.length; j++){
		    //Überflüssige Leerzeichen abschneiden:
		    String wort=result[j].trim();
		    //Leere Strings ignorieren:
		    if (!wort.equals("") ){
		    	//Erste Spalte (indizes) wird ignoriert:
		    	if (col!=0){
                                                //Einträge einer Zeile generieren 
                                                 // (Umwandlung in Double):
                                                entry[col-1]=Double.valueOf(wort).doubleVaue();
			}		
			//Spaltenindex der Matrix erhöhen:
                                                col++;
			}
		}
		// Zeile dem dynamischen Feld hinzufügen:
		matrix.add(entry);
	}
	// Zeilenindex erhöhen:
	i++;	
	
	file.close();
}
```

Wie man sieht lese ich jede Zeile ein, Splitte sie durch Leerzeichen und trimme die Felder des Arrays, so dass nur noch der double Wert drin steht. anschließend schreibe ich die werte in den array entry und füge jede zeile der ArrayList Matrix zu.

Wie schon gesagt, füge ich zwischen spalte 1 und 2 einfach eine Leere Spalte ein, enthält meine "matrix" alle Werte doppelt, also 1-100 und dann nochma das gleich in zeile 101-200.

hoffe das ganze ist verständlich formuliert. bin für jede hilfe dankbar!

gruß munay


----------



## SlaterB (12. Okt 2007)

gehe runter auf 1 oder 2 statt 100 Zeilen und poste dann ein Beispiel einer solchen Datei mit und ohne Leerzeichen

falls du selber denken willst:
dein Code verräte doch genau, wann und wo Elemente eingefügt werden,
die Anzahl hängt anscheinend direkt von der äußeren while-Schleife ab,

schreibe an erster Stelle in die while-Schleife:
System.out.println(durchlauf i, aktuelle Zeile ist ..);
usw



auch beim selber testen sind 1 oder 2 statt 100 Zeilen hilfreich


----------



## munay (12. Okt 2007)

also meiner meinung nach, lag der fehler hier:

result =line.split("\\s");

mit 
result =line.split(" ");

funktionierts nämlich. aber danke für den tipp es mit weniger zeilen zu versuchen. stehe aber nun vor einem neuen problem im gleichen kontext: 


```
20	 99.2743 	29.0802   -27.4889         4.30027
  21	100.2609 	28.4577   -26.8478         4.33224
```

ist in den daten ein Sprung in der Anzahl der Zeichen, wi ein Zeile 21, spalte 2, bekomme ich als ausgabe:


```
99.2743 29.0802 -27.4889 4.30027
28.4577 -26.8478 4.33224 0.0
```

der betreffende eintrag wird also ignoriert...warum?


----------



## SlaterB (12. Okt 2007)

ich kann das nicht nachvollziehen, ich werde z.B. nicht dein gesamtes Programm mit der Datei usw. nachbauen,

allgemeiner Tipp den du folgen oder ignorieren kannst:
schreibe keine kompletten Programme, wenn du dich darin nicht zurechfindest

die 100.2609 wird nicht eingelesen? nun, dann erstelle eine Datei nur mit der 100.2609 drin und fange an nur diese einzulesen, statt 100 Zeilen anderer Code drumherum,
bisschen extremes Vorgehen, aber ich bin grad genervt weil ich den Fehler nicht sehe 
(und du gar nix beiträgst außer 'wird also ignoriert...warum?')

bei mir läuft jedenfalls alles:


```
class Test
{

    public static void main(String args[])
        throws Exception
    {
        // RandomAccessFile file;
        // String line;
        String[] result;
        double[] entry;
        int i = 0, col = 0;
        // Datei zum Lesen öffnen:
        // file=new RandomAccessFile(datname, "r");
        // Zeilenweises abarbeitender Datei:

        String[] lines = new String[4];
        lines[0] = "";
        lines[1] = "";
        lines[2] = "20    99.2743    29.0802   -27.4889         4.30027 ";
        lines[3] = "21   100.2609    28.4577   -26.8478         4.33224 ";


        // while ((line = file.readLine()) != null) {
        for (String line : lines)
        {
            // entry soll Daten einer Zeile enthalten:
            entry = new double[4];
            // Einlesen der 2 Kopfzeilen:
            if (i <= 1)
            {
                // header[i]=line;
            }
            // Daten stehen in den Zeilennummern:
            if (i > 1 && i < 102)
            {
                // Aufteilen einer Zeile in ein Array von Strings:
                result = line.split("\\s");
                col = 0;
                for (int j = 0; j < result.length; j++)
                {
                    // Überflüssige Leerzeichen abschneiden:
                    String wort = result[j].trim();
                    // Leere Strings ignorieren:
                    if (!wort.equals(""))
                    {
                        // Erste Spalte (indizes) wird ignoriert:
                        if (col != 0)
                        {
                            // Einträge einer Zeile generieren
                            // (Umwandlung in Double):
                            entry[col - 1] = Double.valueOf(wort).doubleValue();
                            System.out.print(+entry[col - 1] + " ");
                        }
                        // Spaltenindex der Matrix erhöhen:
                        col++;
                    }
                }
                System.out.println();
                // Zeile dem dynamischen Feld hinzufügen:
                // matrix.add(entry);
            }
            // Zeilenindex erhöhen:
            i++;

            // file.close();
        }
    }
}

->

99.2743 29.0802 -27.4889 4.30027 
100.2609 28.4577 -26.8478 4.33224
```


----------



## munay (12. Okt 2007)

sorry for being genervt 

ich weiss nicht ob du meinen 2. beitrag überlesen hast, aber da ändere ich ja eine zeile, nämlich

result =line.split("\\s");  in     result =line.split(" ");

damit funktioniert dann zwar die leerzeichen-geschichte aus meinem ersten Beitrag, aber wie ich gerade bemerkt habe eben nicht das einlesen der zahl 100.2609. 

der hund liegt also definitiv in der Angabe des split zeichens begraben.

habe gerade in einem anderen forum folgende aussage gefunden:



> wofür ist denn eigentlich das + in str.split("\\s+")?
> 
> die methode String.split(String) erwartet eine Regular Expression, und + heisst in einer RE: 'das vorige zeichen kommt mindestens einmal oder öfter vor'. D.h ohne das + würde der string "a b" in "a" und " b" aufgesplittet werden, mit dem + in "a" und "b".



und mit dem + im code klappt alles.

danke für eure zeit und hilfe!

gruß Munay


----------

