Zeilenweise lesen aus einem Array

Status
Nicht offen für weitere Antworten.
K

Katjushka

Gast
GEGEBEN: Eine Text-Datei 10MB mit den URLs und ihren Inhalten. Die sieht etwa so aus:
@@@ http://braeustueble.de/impressum.html


[br_Logo_web.gif]

Impressum

Gaststätte Bräustüble GbR
Postadresse
Schloßstraße 14
74831 Gundelsheim
Telefon
06269-8453
FAX
06269-45285
E-Mail
service@braeustueble.de
Vertretungsberechtigte Gesellschafter: Gisela Frank
Haftungshinweis: Trotz sorgfältiger inhaltlicher Kontrolle übernehmen wir
keine Haftung für die Inhalte externer Links. Für den Inhalt der verlinkten
Seiten sind ausschließlich deren Betreiber verantwortlich.
Kontakt


ZIEL: Firmennamen aus den URLs extrahieren
VORGANG: 1. Jede URL und ihre Inhalt wird in einen Array blocks[] eingelesen. Das Array enthält also in jeder Zelle
eine URL und ihre Inhalt
2. Das Array wird durchgelaufen, und in jeder "Zelle" wird nach dem RegEx gesucht. Bis jetzt habe ich es so
gemacht:
Code:
		 for(int i =0; i<blocks.length; i++){
		      Matcher matcher2 = pattern2.matcher(blocks[i]);
               while(matcher2.find()){
                  
                   String regexImage ="(\\[.*|\\s{2,}|\\*|@@@.*|www.*|.*\\|.*|ist.*|\\sin\\s.*|\\s.\\s|Verantwortlich für diese Seite|\\s.{4}\\s{2,}|Firmenname:?\\s*|Vereinsname:?|Name:?|\\d{3,}|Firma:?\\s|Verantwortlich für die Website:|Email.*|\\.\\W*|Info:.*|Mail:.*|\\sund.*|,.*|\\_*)";
                   Pattern patternImage= Pattern.compile(regexImage);
                   firmenname = matcher2.group();
                   
                   Matcher matcherImage =patternImage.matcher(firmenname);
                   firmenname = matcherImage.replaceAll("");
                  
                   if (firmenname.length() > 5){
                   firmenname="Firmenname: "+firmenname+"\n";    
                                 
                      try {
                           for (int n=0; n < firmenname.length(); n++){
                              schreibeStrom.write((byte)firmenname.charAt(n));
                            }
                        } catch (IOException ex) {
                            ex.printStackTrace();
                        }
                   }
               }
PROBLEM: Das Verarbeiten von "kleinen" URLs geht ziemlich flott, für die größeren Inhalte braucht das Programm
aber sehr lange.
LÖSUNG, DIE ICH MIR VORSTELLE: innerhalb der Zellen Zeilenweise einlesen, also etwas in der Art:
Code:
	for(int i =0; i<blocks.length; i++){
		 while((thisLine=reader.readLine())!=null){// oder so ähnlich
			TODO
		 }
		 }
Wie könnte ich so etwas implementieren?

Vielen Dank im Voraus.
 
K

Katjushka

Gast
Kann mir wirklich keiner helfen? :(
Jetzt hab ich das Programm laufen lassen, und es läuft 10 Stunden auf meinem PC.
Wenn keiner weiß, wie es mit dem zeilenweise Einlesen geht, habt ihr vielleicht andere Ideen, wie man die Laufzeit verbessern könnte?
Vielen Dank
 

madboy

Top Contributor
zum Beschleunigen der Sache: mach erst mal das aus der Schleife raus:
Code:
                   String regexImage ="(\\[.*|\\s{2,}|\\*|@@@.*|www.*|.*\\|.*|ist.*|\\sin\\s.*|\\s.\\s|Verantwortlich für diese Seite|\\s.{4}\\s{2,}|Firmenname:?\\s*|Vereinsname:?|Name:?|\\d{3,}|Firma:?\\s|Verantwortlich für die Website:|Email.*|\\.\\W*|Info:.*|Mail:.*|\\sund.*|,.*|\\_*)";
                   Pattern patternImage= Pattern.compile(regexImage);

dann nimm einen StringBuilder anstatt
Code:
"Firmenname: "+firmenname+"\n";

Code:
for (int n=0; n < firmenname.length(); n++){
                              schreibeStrom.write((byte)firmenname.charAt(n));
                            }
Ist schreibeStrom was gepuffertes? Falls nicht: nimm was gepuffertes. Oder einen Writer. Dann kannst du Strings auf ein Mal schreiben anstatt jedes Byte extra.

Allgemein noch: wenn du es irgendwie einrichten kannst: lass den regex nicht über alles laufen. Das wird sehr langsam.
Treffe statt dessen eine "vorauswahl", z.B. mit IndexOf und matche die dann mit dem regex.

Ausserdem kannst du auch selber schauen, wo das Programm so lange braucht. Ein paar Ausgaben in der Art sollten dich auf die richtige Spur bringen:
Code:
long time = System.currentTimeMillis();
//vermuteter Übeltäterblock ;-)
System.out.println("time: " + (System.currentTimeMillis() - time))

Lies doch direkt von der Textdatei, anstatt erst in das Array. Dann kannst du sowas machen
Code:
while((thisLine=reader.readLine())!=null){// oder so ähnlich 
         TODO 
}
 
K

Katjushka

Gast
Das mit dem Writer klappt komischerweise nicht:
Code:
 writer = new FileWriter("123.txt");
            for(int i =200; i<250; i++){ 
             
                    Matcher matcher = pattern.matcher(blocks[i]);
                    while (matcher.find()){
                         aktuelleurl=(i+1)+matcher.group(2)+"\n"; 
       
                           System.out.println(aktuelleurl);
                        try {
                                writer.write(aktuelleurl);
                            } catch (IOException ex) {
                                ex.printStackTrace();
                            }
                      }
               }

bei solchem Code, bekommt man zwar keine Fehlermeldungen, aber die Ergebnisdatei bleibt leer :( Wenn ich das gleiche schreibe bloss mit:
Code:
                      try {
                               for (int n=0; n < aktuelleurl.length(); n++){
                                  schreibeStrom.write((byte)aktuelleurl.charAt(n));
                                }
                            } catch (IOException ex) {
                                ex.printStackTrace();
                            }
läuft das Programm, so wie ich will.
Was könnte der Grund sein?
 

Wildcard

Top Contributor
Solange in deinem Code noch irgendein String + String steht brauchen wir über Performance eigentlich gar nicht weiter zu reden :wink:
Die nächste Sache ist das rausschreiben. Bei größeren Datenmengen ist hier der FileChannel am schnellsten.
 
K

Katjushka

Gast
Aber ein Writer akzeptiert keinen StringBuilder als Parameter, und toString funktioniert mit einem StringBuilder auch nicht.:(
 
S

stev.glasow

Gast
Wird (i+1)+matcher.group(2)+"\n" nicht eh vom compiler in str_buf.append(bla) optimiert?
Hast du mal nen Profiler darüber laufen lassen? Ich glaub dein regex ist übelst langsam diese .* fressen gut zeit soweit ich weiß, mach da mal nen .+? draus so weit das möglich ist.

toString() in java.lang.Object cannot be applied to (java.lang.StringBuilder)
öh?
 
K

Katjushka

Gast
Nicht vergessen, es ist ein "Anfängerfragen" Thread:):)
Wird (i+1)+matcher.group(2)+"\n" nicht eh vom compiler in str_buf.append(bla) optimiert?
Sagt mir leider gar nichts.
Von einem Profiler höre ich zum ersten Mal in meinem Leben. Hab jetzt bei Google angegeben, scheint ein Programm zu sein, dass einen Code nach Laufzeiten und vielleicht Speicherbedarf kontrolliert, oder?

Das Zitat wurde für Wildcard gepostet, weil er gemeint hat, dass toString() für einen StringReader funktioniert.
 
S

stev.glasow

Gast
Katjushka hat gesagt.:
Nicht vergessen, es ist ein "Anfängerfragen" Thread:):)
Wird (i+1)+matcher.group(2)+"\n" nicht eh vom compiler in str_buf.append(bla) optimiert?
Sagt mir leider gar nichts.
Damit wollte ich sagen dass es bei sowas
Code:
(i+1)+matcher.group(2)+"\n"
oder sowas
Code:
"Firmenname: "+firmenname+"\n";

eigentlich egal ist ob du da nun selber nen StringBuffer (bzw StringBuilder) verwendest, der compiler macht das in diesem fall intern sowieso schon (glaube ich).


Katjushka hat gesagt.:
Von einem Profiler höre ich zum ersten Mal in meinem Leben. Hab jetzt bei Google angegeben, scheint ein Programm zu sein, dass einen Code nach Laufzeiten und vielleicht Speicherbedarf kontrolliert, oder?
Jo, damit kann man relativ einfach performance kritische aufrufe herausfinden, aber versuch erstmal deinen regulären ausdruck wie beschrieben abzuändern.


Katjushka hat gesagt.:
Das Zitat wurde für Wildcard gepostet, weil er gemeint hat, dass toString() für einen StringReader funktioniert.
funktioniert auch. irgendwie machst du da was falsch. hier mal nen beispiel:

Code:
		  StringBuilder buf = new StringBuilder();
		  buf.append("das");
		  buf.append(' ');
		  buf.append("ist ");
		  buf.append("ein test");
		  String str = buf.toString();
		  System.out.println(str);
Ausgabe: das ist ein test
 

Wildcard

Top Contributor
Ja, der Compiler baut das in StringBuilder/Buffer um (anders kann man Strings nicht verknüpfen). Das Problem ist, das er nicht in der Lage ist den Builder/Buffer in einer sinnvollen Größe zu initialisieren und die richtige Position zur Objekterzeugung zu finden.
In Schleifen führt das zu massiven Laufzeitproblemen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Datei zeilenweise lesen Java Basics - Anfänger-Themen 19
G Zeilenweise lesen Java Basics - Anfänger-Themen 17
B Textdatei Zeilenweise lesen? Java Basics - Anfänger-Themen 3
fbn Datei als Ganzes lesen (nicht zeilenweise) Java Basics - Anfänger-Themen 8
H Datei zeilenweise rückwärts lesen Java Basics - Anfänger-Themen 9
N aus .txt innerhalb eines JARs Zeilenweise lesen Java Basics - Anfänger-Themen 8
J Datei zeilenweise lesen. Java Basics - Anfänger-Themen 4
M Text Zeilenweise ein lesen und Spaltenweise ausgeben Java Basics - Anfänger-Themen 2
3 Textdatei Zeilenweise auslesen Java Basics - Anfänger-Themen 3
X Textdatei: zwei-zeilenweise gleiche Zeilen rausschmeißen Java Basics - Anfänger-Themen 21
N Datei Zeilenweise einlesen, Ausgabe mehrere Arrays Java Basics - Anfänger-Themen 7
B Datei zeilenweise auslesen Java Basics - Anfänger-Themen 7
C Laufzeitverhalten beim zeilenweise durchlaufen eines 2 dimensional array Java Basics - Anfänger-Themen 6
T Zeilenweise Excel-Datei mit Strings befüllen Java Basics - Anfänger-Themen 28
D Texdatei zeilenweise einlesen Java Basics - Anfänger-Themen 3
J Array manuell vom User eingeben, Zeilenweise Java Basics - Anfänger-Themen 2
A CSV Zeilenweise einlesen und in einer HashMap speichern Java Basics - Anfänger-Themen 12
D txt-Datei zeilenweise als String einlesen Java Basics - Anfänger-Themen 2
E Zeilenweise in Dateich schreiben Java Basics - Anfänger-Themen 5
T Input/Output 20Mb Textdatei zeilenweise auslesen Java Basics - Anfänger-Themen 10
E Input/Output Linux datei in Windows zeilenweise einlesen Java Basics - Anfänger-Themen 4
B INI Zeilenweise einlesen. Java Basics - Anfänger-Themen 6
E Zeilenweise einlesen Java Basics - Anfänger-Themen 5
B txt Datein zeilenweise einlesen Java Basics - Anfänger-Themen 4
B Die PHP Ausgabe Zeilenweise in Java auslesen Java Basics - Anfänger-Themen 8
-horn- CSV-file zeilenweise einlesen, was bearbeiten, nächste Zeile Java Basics - Anfänger-Themen 15
G String zeilenweise einlesen Java Basics - Anfänger-Themen 2
A Datei einlesen und splitten nur zeilenweise Java Basics - Anfänger-Themen 7
G Zeilenweise Tastatureingaben Java Basics - Anfänger-Themen 2
A Zeilenweise einlesen eines Strings Java Basics - Anfänger-Themen 4
N Textdatei zeilenweise auslesen Java Basics - Anfänger-Themen 8
S Daten zeilenweise aus Datei einlesen Java Basics - Anfänger-Themen 7
Dilandau textdatei zeilenweise schreiben? Java Basics - Anfänger-Themen 2
M Matrizen zeilenweise einlesen (Größe unbekannt) Java Basics - Anfänger-Themen 4
P problem mit zeilenweise einlesen aus Datei Java Basics - Anfänger-Themen 6
S txt Einlesen (Zeilenweise) Java Basics - Anfänger-Themen 3
A Hilfe beim Lesen von Pfaden und Systemvariablen Java Basics - Anfänger-Themen 3
I API - zurückgegebener JSON String lesen und in Entity konvertieren Java Basics - Anfänger-Themen 2
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
N Textdatei aus Resourcen-Ordner eines Projekts/ jar-file lesen Java Basics - Anfänger-Themen 4
W Timestamp lesen Java Basics - Anfänger-Themen 6
J Dateien lesen und schreiben Java Basics - Anfänger-Themen 5
F MS365 Kalender lesen Java Basics - Anfänger-Themen 5
Robin Gentele XML von Webserver lesen und ausgeben Java Basics - Anfänger-Themen 5
H Scripte oder Programmcode aus Datei lesen? Java Basics - Anfänger-Themen 5
S Zufällige ungerade Zeile aus Text-Datei lesen Java Basics - Anfänger-Themen 5
C Fehlermeldungen lesen Java Basics - Anfänger-Themen 2
S Allgemeine Java Codes lesen und verstehen Java Basics - Anfänger-Themen 7
NeoLexx Datenströme Lesen und Schreiben einer Textdatei Java Basics - Anfänger-Themen 2
rafi072001 Lesen aus einem Excel File Java Basics - Anfänger-Themen 10
T Klassen Den Wert aus Array lesen lassen Java Basics - Anfänger-Themen 12
J Lesen und schreiben in eine Datei(Anfänger- Dateizugriffe) Java Basics - Anfänger-Themen 3
S JSON Datei schreiben und lesen Java Basics - Anfänger-Themen 3
S Java Array Länge aus anderer Klasse lesen Java Basics - Anfänger-Themen 1
G Excle datei aus resources folder finden und lesen Java Basics - Anfänger-Themen 5
J Datei aus Projektfolder lesen Java Basics - Anfänger-Themen 12
H Vererbung Static Scanner Objekt verwenden - von StdIn in einer importierten Klasse lesen Java Basics - Anfänger-Themen 10
K Probleme beim Programm schreiben - Lesen von Dateiinhalten -zaehlen von Wörtern/ Buchstaben Java Basics - Anfänger-Themen 4
S Tastatur input lesen Java Basics - Anfänger-Themen 7
S Mit FileReader lesen, in ArrayList speichern Java Basics - Anfänger-Themen 4
B Aus Datei lesen Java Basics - Anfänger-Themen 23
B Aus Datei lesen Java Basics - Anfänger-Themen 0
deatzi Wert aus anderer Klasse lesen Java Basics - Anfänger-Themen 7
W Wie lasse ich meine Ausgabe nach dem Lesen verschwinden ? Java Basics - Anfänger-Themen 1
A JSON Lesen und Schreiben. Java Basics - Anfänger-Themen 3
S Daten lesen und speichern Java Basics - Anfänger-Themen 26
C Input/Output Datei aus Startverzeichnis lesen Java Basics - Anfänger-Themen 6
amazinglife77 Input/Output Lesen/Schreiben Properties: in eclipse geht, als JAR nicht Java Basics - Anfänger-Themen 4
G Input/Output Aus txt-Datei lesen, aus Ordner Java Basics - Anfänger-Themen 1
S BufferedReader nächste Zeile lesen Java Basics - Anfänger-Themen 4
sourcecorn Werte aus einem File lesen Java Basics - Anfänger-Themen 6
G Jar-Archiv zum Lesen einer Konfigurationsdatei Java Basics - Anfänger-Themen 9
MaxG. Input/Output Datei lesen Java Basics - Anfänger-Themen 3
Hacer Quellcode lesen Java Basics - Anfänger-Themen 13
H Aus wav-datei lesen und in neue wav-datei speichern Java Basics - Anfänger-Themen 10
N Lesen eines files mit FILES.lines Java Basics - Anfänger-Themen 11
A Private Attribut aus fremder Klasse lesen ? Java Basics - Anfänger-Themen 19
R Ab einer bestimmten Zeile lesen Java Basics - Anfänger-Themen 3
P vokale konsonanten ziffern satzzeichen aus string lesen. hab kiene ahnung Java Basics - Anfänger-Themen 10
A textfeldwerte aus array lesen Java Basics - Anfänger-Themen 27
K Classpath Lesen von Property-File Java Basics - Anfänger-Themen 1
D Methoden Array aus Datei lesen und weitergeben? Java Basics - Anfänger-Themen 7
T 'Nix' aus Textdokument lesen Java Basics - Anfänger-Themen 11
G tga Datei lesen und in eine matrix umwandeln Java Basics - Anfänger-Themen 1
F Input/Output Dateien lesen/schreiben Java Basics - Anfänger-Themen 1
E lesen csv file column by column Java Basics - Anfänger-Themen 10
G Bis zu einem bestimmten Punkt aus Datei lesen Java Basics - Anfänger-Themen 2
K Mit Scanner aus einer txt Datei lesen und jede Person mit name, vorname, geburtsdatum speichern Java Basics - Anfänger-Themen 5
K Dateien lesen | IndexOutOfBoundsException Java Basics - Anfänger-Themen 2
E Input/Output Property-Datei aus einer Zip lesen in in einer anderen Zip-Datei ist Java Basics - Anfänger-Themen 3
B Input/Output Scanner-Probleme bei String-Lesen Java Basics - Anfänger-Themen 3
I Properties oder Umgebungsvariablen mit ${irgendwas} lesen? Java Basics - Anfänger-Themen 2
D Lesen aus Datei (java.util.NoSuchElementException) Java Basics - Anfänger-Themen 22
D Problem beim Lesen einer txt-Datei Java Basics - Anfänger-Themen 8
G Zeile charweise lesen Java Basics - Anfänger-Themen 3
J Aus Datei lesen und ausgeben Java Basics - Anfänger-Themen 4
N Bestimmte Inhalte aus Datei lesen Java Basics - Anfänger-Themen 11
M Wie sämtliche Schlüssel und Attibutwerte aus einer Propertie Datei lesen? Java Basics - Anfänger-Themen 3
S Compiler-Fehler jOpenDocument Kompelierfehler - ODS Datei lesen Java Basics - Anfänger-Themen 2
C Aus einer Textdatei Zahlen lesen mit Leerzeichen Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben