Java - Problem aus Textdatei Zeilen zu lesen

Fabiansson

Cadet 3rd Year
Registriert
Jan. 2009
Beiträge
56
Hallo Leute.. ich versuche im Moment in Java ein Programm zu schreiben, welches mir eine Textdatei einliest und dann nur die gewünschten Werte davon ausgibt.
Ich möchte dies in jeder Zeile einzeln machen und dann mit hilfe von Arrays auf die Werte zugreifen. Die Werte in einer Zeile sind mit einem Koma abgetrennt.

Nun aber das Problem:
Die erste Zeile funktioniert supper, jedoch bei der zweiten Zeile bekomme ich nur null's. Sie wird demnach nicht korrekt ausgelesen.
Ich habe schon viel versucht und gesucht aber zur Lösung bin ich leider bisher noch nicht gekommen.

Hier mal mein Code
private void prufung()
{
String line = null;
char tempchar = 0;
int komas = 0;
String xkor [] = new String [10000];
String ykor [] = new String [10000];
String volk [] = new String [10000];
String dorfname [] = new String [10000];
String ew [] = new String [10000];

int linenumber = 0;

int stellen = 0;
try
{
BufferedReader br = new BufferedReader(new FileReader("map.txt"));



LineNumberReader lnreader = new LineNumberReader(br);

//trennt quasi Infos von Komas
while((line = lnreader.readLine()) != null)
{
for(int i = 0; i < line.length(); i++)
{
linenumber = lnreader.getLineNumber();
tempchar = line.charAt(i);


if(tempchar == ',') //unnütze Zeichen
{
stellen = 0;
komas++;
}

///////////XKoordinate auslesen
else if(tempchar != ',' && komas == 1)
{
if(stellen == 0)
{
xkor[linenumber] = String.valueOf(tempchar);
stellen++;
}
else
{
xkor[linenumber] += String.valueOf(tempchar);
}
}

/////////////YKoordinate auslesen
else if(tempchar != ',' && komas == 2)
{
if(stellen == 0)
{
ykor[linenumber] = String.valueOf(tempchar);
stellen++;
}
else
{
ykor[linenumber] += String.valueOf(tempchar);
}
}

////////////Volk auslesen
else if(tempchar != ',' && komas == 3) //nach 3tem Koma Volk
{
volk[linenumber] = String.valueOf(tempchar);
}

///////////Dorfname auslesen
else if(tempchar != ',' && komas == 5) //nach 5tem Koma Dorfname
{
if(stellen == 0)
{
dorfname[linenumber] = String.valueOf(tempchar);
stellen++;
}
else
{
dorfname[linenumber] += String.valueOf(tempchar);
}
}

////////////EW auslesen
else if(tempchar != ',' && komas == 10 && tempchar != ')' && tempchar != ';') //nach 10tem Koma EW
{
if(stellen == 0)
{
ew[linenumber] = String.valueOf(tempchar);
stellen++;
}
else
{
ew[linenumber] += String.valueOf(tempchar);
}
}

///////Alle anderen Zeichen
else
{
}

}
}
}

catch(Exception e)
{
System.out.println("FAIL!");
}

System.out.println("xkor:" + xkor [1]);
System.out.println("ykor:" + ykor [1]);
System.out.println("volk:" + volk [1]);
System.out.println("name:" + dorfname [1]);
System.out.println("ew:" + ew [1]);

System.out.println("xkor:" + xkor [2]);
System.out.println("ykor:" + ykor [2]);
System.out.println("volk:" + volk [2]);
System.out.println("name:" + dorfname [2]);
System.out.println("ew:" + ew [2]);

Ich hoffe sehr, ihr könnt mir helfen. Besten Dank zum voraus.

Gruss Fabiansson;)
 
Wie sieht denn die Textdatei aus, die eingelesen werden soll?
 
Also wenn ich mir den Quellcode mit Notepad++ ansehe, sieht man sofort, dass z.B. der Block "EW einlesen" nicht mehr in der For-Schleife enthalten ist. Vielleicht macht das ja schon Probleme, aber sonst wäre eine Beispieldatei wirklich nicht schlecht.

P.s.: Wenn die Daten für einen Datensatz wirklich immer in einer Zeile stehen und durch Kommas getrennt werden, sollte man vielleicht split() benutzen ;-)..
 
Zuletzt bearbeitet:
Das zeilenweise Einlesen ist schon ok. java.util.Scanner eignet sich eher für andere Problemstellungen.
 
Danke schonmal für die rasche Antwort.

Hier mal ein Beispiel der Textdatei:

INSERT INTO `x_world` VALUES (405693,-14,-106,3,36618,'01 No limit[EMP]',24570,'mobben!',0,'',43);
INSERT INTO `x_world` VALUES (404902,-4,-105,1,34442,'rome',24178,'romcia',0,'',67);

Also bis zum ";" immer in einer Zeile. As gibt dann noch viele weitere Zeilen aber als Beispiel reichen zwei denke ich.

;)
 
Hast du Zugriff auf die DB? Dann bau dir doch einen Connector, der direkt aus der DB liest. Ist vllt. einfacher und effizienter als mit Files und Stringoperationen rumzuhantieren.
 
Nein hab ich nicht, das einzige was ich von der DB bekomme ist dieses Textfile.
 
Code:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class SQLReader {

	public static void main(String[] args) {
	    SQLReader reader = new SQLReader();	 
	    reader.readFile();
    }
	
	public void readFile() {
		File file = new File("C:\\Temp\\testfile.txt");
		FileReader fr;
		try {			
			fr = new FileReader(file);
			BufferedReader br = new BufferedReader(fr);			
			
			String line = null;
			while((line = br.readLine()) != null){
				String[] values = line.split(",");
				for(String val:values) {
					System.out.println(val);
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
		
	}
}

Hier kannst du jetzt in der while Schleife deine ganze Magic Zeile fuer Zeile veranstalten.
 
Zuletzt bearbeitet:
Ja okay danke viel mals, dass funktioniert schon ganz gut :)

Nur wie bekomme ich jetzt nur diese Daten aus, die ich will? Z.B. den Wert nach dem 2ten Koma.

Lg
 
Du hast doch mit "values" ein String Array an der Hand und kannst mit values[2] auf den dritten Wert des Arrays zugreifen.
 
Achja, stimmt hab ich übersehen :D
Also danke für die hilfe hier :)
 
Zurück
Oben