Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich bin noch neu hier und weiß nicht genau wie ich das Problem beschreiben soll. Daher kann ich leider auch nicht direkt danach suchen ob es das Thema schon einmal gab.
Mein Problem ist folgendes:
Ich habe eine txt-Datei voller Daten.
Pro Zeile steht eine ID, PLZ, Stadt, Straße, Hausnummer und ggf noch Zusatz (z.b. a)
Mittels Matcher suche ich die ID, die in irgendeiner Zeile stehen kann.
Wenn ich die gefunden habe will ich in genau der Zeile die anderen Daten (also: PLZ, Stadt, Straße, Hausnummer und ggf noch Zusatz) kopieren.
Mit einer Schleife drüberlaufen und Zeile für Zeile einlesen. Dann die Zeile, die dir gereicht eben weiter verarbeiten.
Ansonsten musst du es mal mit Pattern Groups probieren.
Ich würde die Datei zeichenweiße Kopieren! Also einen Reader auf die Source-Datei und einen Write auf die Destination-Datei. Dann die Chars Kopieren und prüfen ob der Matcher nicht passt, falls matcher anfängt zu passen, dann nicht weiter kopieren, sonder matcher Komplet laden und dazu passende Datei mit einem Reader offenen. Nun vom neunen Reader zeichenweiße kopieren. wenn neue Datei abschlossen, weiter mit dem alten Lesen.
@dayaftereh: zeichen für zeichen ist keine option!
die Datei ist riesig und die funktion ist ein teil eines größeren projekts und da kommt es u.a. auf die schnelligkeit an und das wäre dann kontroproduktiv, da diese funktion mal eben bis zu 9.000 mal durchlaufen wird, habe ich aber vergessen zu erwähnen sry
hier mal mein code-fragment bisher:
Java:
....//holt sich die ID aus einer von vielen xml-Dateien
BufferedReader br = new BufferedReader(new FileReader("Referenztabelle.txt"));
while ((s=br.readLine())!=null)
{
Pattern pattern = Pattern.compile(type4.getValue());
Matcher matcher = pattern.matcher(s);
if (matcher.find())
{
System.err.println("found: "+matcher.group());//test ob gefunden wurde
[...]//hier sollte die funktion rein
}
else{System.out.println("ID "+variable+" nicht vorhanden!");}
}
Na ja, du musst sowie so jedes Zeichen anfassen. ReadLine macht ja auch nix anderen. Es baut solange ein String zusammen bis \r\n kommt. Ob du jetzt Zeilenweiße oder zeichenweiße durchgehst, die Methode wird sowie so genauso oft aufgerufen. Wenn du 9000 matches hast, wird die Methode 9000 aufgerufen.
solange (lineReader.next = zeile) != null
zeile Untersuchen.
mit zeile.substring(positionDeinerId,endeDerId) schauen ob es die richtige ist
falls es die richtige ist
mach was immer du damit machen moechtest
alles in eine eigene Methode packen, die das noetigste ubergeben bekommt und es ist sauber
Dein Problem ist, dass Du eigentlich einen falschen Ansatz hast: grosse Datenmengen versucht man zu indizieren statt sie in einen riesen Block zu packen und dann mit irgendeneiner Volltextsuche zu durchsuchen.
Also erstmal eine Hilfsklasse:
Java:
public class DataLine {
public String strID=null;
public String strZIP=null;
public String strStreet=null;
public String strNumber=null;
public class DataLine(String str) {
// hier die übergebene Zeile in Tokens aufteilen und strID, strZIP, strStreet, strNumber... zuweisen
}
}
Dann die Datei durchlesen und in eine HashMap packen
Java:
HashMap hmAddress = new HashMap();
BufferedReader br = new BufferedReader(new FileReader("tabelle.txt"));
String buffer=null;
while (buffer=br.readLine())!=null) {
DataLine dl = new DataLine(br.readLine());
hmAddress.put(dl.strID, dl);
}
br.close();
Also wenn ich das jetzt richtige verstehe, willst du aus eine Datei zeilenweiße lesen und wenn du eine Zeile mit einem bestimmten Key gefunden hast, diese Zeile mit einer neuen ersetzen? Die gelesenen Zeilen sollen dann wieder in einer neue Datei geschrieben werden oder die ersetzte Zeile?