Scanner für große Textdatei

techdevil

Aktives Mitglied
Hi,

hier ein simpler Code zum zählen der Zeilen in einer Textdatei.

Java:
	public static int getNumLines(String inputPath) throws IOException{
		
		int res = 0;
		String test = null;
		
		Scanner input = new Scanner(new File(inputPath));
		
		while(input.hasNextLine()){ //input.hasNext() liefert das gleiche Problem
			
			input.nextLine();

			res++;
		} 
		
		input.close();
		return res;		
	}

Funktioniert gut bei bei vielen, auch beliebig großen Files - aber u.a. nicht bei folgender Wortliste.
105MB große Wortliste. Pass: 4gulli Die Liste hat pro Zeile ein Wort.

Die While-Schleife stoppt zu früh. Die letzten gelesenen Zeilen sind:

...
abbuiati
abbuiato
abbuiava
abbuiavano
abbuino
abb

Wobei das letzte Wort eigentlich laut normalem Texteditor "abbuio" heißen sollte. Die Methode liest aber nach dem zweiten "b" anscheinend ein Carriage Return und danach liefert hasNextLine() false. Die Ausgabe 648034 passt aber trotzdem nicht. Laut Texteditor befindet sich "abbuino" in Zeile 648104.

Hat das mit fehlerhaften Zeilenumbruch-Zeichen oder vielleicht mit der eingestellen Codierung zu tun?
Der Texteditor (Linux Gedit) lässt an der Stelle nichts vermuten.

Gruß
 
Zuletzt bearbeitet:

Ark

Top Contributor
Laut vim befindet sich in Zeile 648104 der Eintrag "abbyland^M" (das ^M deutet auf einen Windows-Zeilenumbruch hin, gehört also nicht wirklich zur Zeile). In Zeile 648034 steht bei mir "abbuio^M".

Ich weiß gerade nicht, ob es was mit dem Problem zu tun hat, aber anscheinend wechselt ab und zu mal die Kodierung. So steht z.B. das Wort "abbrände" doppelt drin: einmal mit ä in UTF-8-Kodierung und einmal mit ä in einer Kodierung, die ich noch nicht identifizieren konnte (im Folgenden Ausschnitt von vim als <84> wiedergegeben):

Code:
   647917 abbrv^M
   647918 abbr<84>nde^M
   647919 abbr<94>ckeln^M
   647920 abbr<94>ckelnd^M
   647921 abbr<94>ckelnde^M
   647922 abbr<94>ckelnden^M
   647923 abbr<94>ckelnder^M
   647924 abbr<94>ckelndes^M
   647925 abbrände^M
   647926 abbröckele^M
   647927 abbröckeln^M
   647928 abbröckelnd^M
   647929 abbröckelnde^M
   647930 abbröckelndem^M
   647931 abbröckelnden^M
   647932 abbröckelnder^M
   647933 abbröckelndes^M
   647934 abbröckelst^M
   647935 abbröckelt^M
   647936 abbröckelte^M
   647937 abbröckelten^M
   647938 abbröckeltest^M
   647939 abbröckeltet^M
   647940 abbröckle^M
   647941 abbrühen^M
   647942 abbs^M
Möglicherweise steht da also irgendwo eine Zeile, bei der die Zeichen so kodiert sind, dass dann (wegen der Kodierung) fälschlicherweise ein Zeilenumbruch erkannt wird, wo keiner sein sollte.

Ark
 

techdevil

Aktives Mitglied
Mit welchen Parametern hast du Vim gestartet?
Ohne jegliche Config-Parameter liefert Vim mir von deiner Ausgabe abweichende Zeilennummerierungen und keine "^M"

Das Wort "abbuio", wo die Java-Methode oben hakt, beinhaltet laut Vim aber kein Zeilenumbruchzeichen.
Vim zeigt das ganz normal an.

@kaetzacoatl: Kannst du mir vielleicht nen Tip geben, wie ich das am besten mache? BufferedReader und Scanner liefern ja nur Strings zurück. Und bei einem Inputstream wirds sicher schwer die passende Zeile zu finden, oder?
 
Zuletzt bearbeitet:

Ark

Top Contributor
Ehrlich gesagt: Ich kenne mich da gerade auch nicht so gut aus. :D Aber vielleicht helfen folgende Ausgaben:
Code:
22:42:35 ark@tiger:~$ cat .vimrc 
set number
set listchars=tab:\|\ ,trail:.,extends:>,precedes:<,nbsp:_
set list
syntax on
set shiftwidth=4
set tabstop=4
set autoindent
set nowrap
set scrolloff=8
set sidescrolloff=4
set showtabline=2
set foldcolumn=2
set showmode
set whichwrap=b,s,<,>
set wildmenu

22:42:57 ark@tiger:~$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
22:43:00 ark@tiger:~$
Ark
 

Pentalon

Bekanntes Mitglied
Hi Devil

An der Datei liegt das eher nicht.
Ich habe das ganze zuerst mit Deiner Datei getestet, danach habe ich aus dieser die ersten ca. 30 zeilen rausgelöscht und dann passiert der selbe Fehler etwas weiter unten.
Ich vermute, dass es hier intern zu einem Überlauf kommt.
Ich habe Dein Prorgramm etwas verändert:

Java:
import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class Test5 {

    public static int getNumLines(String inputPath) throws IOException{
        
        int res = 0;
        int bytes = 0;
        String test = null;
        
        Scanner input = new Scanner(new File(inputPath));
        
        while(input.hasNextLine()){ //input.hasNext() liefert das gleiche Problem
            
            test = input.next();
            bytes = bytes + test.length()+2;			 // Bytes aufaddieren inkl. CRNL
            System.out.println("Gelesener String->"+test+" Länge->"+test.length()+" Gesamt gelesen->"+bytes);
 
            res++;
        } 
        
        input.close();
		System.out.println("Anzahl der Bytes= "+bytes);
        return res;     
    }
    
    public static void main(String[] args) throws IOException {
		System.out.println("Anzahl der Zeilen= "+Test5.getNumLines("c:\\temp\\wordlist-final1.txt"));	
	}
}

Anstelle von nextLine habe ich dann einmal next() verwendet. Damit kommt man auch nicht weiter, jedoch erscheint dann bei mir eine Fehlermeldung:

[WR]Gelesener String->abburattate Länge->11 Gesamt gelesen->6520684
Gelesener String->abburattati Länge->11 Gesamt gelesen->6520697
Gelesener String->abburattato Länge->11 Gesamt gelesen->6520710
Gelesener String->abburattatore Länge->13 Gesamt gelesen->6520725
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at rumprobieren.Test5.getNumLines(Test5.java:19)
at rumprobieren.Test5.main(Test5.java:32)[/WR]

Wie gesagt, an der Datei liegt das aus meiner Sicht eher nicht, sonst würde der Fehler weiterhin an der Stelle auftreten, auch wenn ich die Datei etwas kürze. Ausserdem sagt diese Exception, dass der Scanner nicht mehr weiss, wo er zu lesen hat. Ich hab aber leider auch keine Erfahrung mit so riesigen Dateien.

PS: Sieht ja wie eine Wortliste für eine Brute Force Attacke aus :)

Pentalon
 

Pentalon

Bekanntes Mitglied
Hi Devil

Hier eine Variante die Dein Textfile bis zum Ende lesen kann:

Java:
	public static int getNumLines1(String inputPath) {
        int res = 0;
        int bytes = 0;
		String test;
        
		try {
			BufferedReader in = new BufferedReader(new FileReader(inputPath));

			while ((test = in.readLine()) != null) {
				
	            //bytes = bytes + test.length()+2;			 // Bytes aufaddieren inkl. CRNL
	            //System.out.println("Gelesener String->"+test+" Länge->"+test.length()+" Gesamt gelesen->"+bytes);
				res++;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return res;
	}

Ich habe den Ausdruck und das Addieren der Bytes auskommentiert, weil die Ausgabe das Programm sehr langsam macht und das Zählen schnell überläuft.
Ohne die Ausdrucke ist die Datei schnell bis zur letzen Zeile gelesen (dauer ca 2 Sekunden bei mir).

[TIPP]Anzahl der Zeilen= 9586053 <--- Das ist die letzte Zeile !!! [/TIPP]

Ich hoffe das hilft Dir.

Pentalon
 
Zuletzt bearbeitet:

techdevil

Aktives Mitglied
OK also an der größe der Datei allein kanns nicht liegen, habe gerade eine 1gb große 10^8 zeilige Textdatei erfolgreich und korrekt gescannt.

BufferedReader kommt erheblich weiter. Weiß der Geier warum. Aber ob das wirklich die korrekte Anzahl Zeilen ist?

Vim sagt was anderes: 9588099

Das sind immerhin 2046 Zeilen mehr.
 

Pentalon

Bekanntes Mitglied
Das ist die Korrekte Anzahl.
Ich habe die Datei mit Notepad++ angesehen und die letzte Zeilennummer stimmt mit dem Zähler des Programmes überein.

Pentalon
 

Pentalon

Bekanntes Mitglied
Ich hab mir jetzt mal eben VIM installiert.
Er zeigt die selbe Zeilenanzahl wie es auch Notepad++ und das Programm anzeigen (9586053).

Pentalon
 

Anhänge

  • 09.11.png
    09.11.png
    31,4 KB · Aufrufe: 38
Zuletzt bearbeitet:

techdevil

Aktives Mitglied
Danke für die Mühe! Dann wird das wohl korrekt sein.

Mein Vim unter Linux liegt falsch:
 

Anhänge

  • a.jpg
    a.jpg
    40,4 KB · Aufrufe: 34
Zuletzt bearbeitet:

Ark

Top Contributor
Mein vim spuckt die gleiche Zahl aus wie Notepad++ (laut Pentalon):
Code:
  9586043 ÿùóðêà^M
  9586044 ÿùóðíûé^M
  9586045 ÿùóðîì^M
  9586046 ÿùóðó^M
  9586047 ÿÿ^M
  9586048 ÿÿ3ÿ^M
  9586049 ÿÿ3ÿÿfÿÿ^M
  9586050 ÿÿìÿ^M
  9586051 ÿÿìÿÿÿ^M
  9586052 ÿÿÿ^M
  9586053 ÿÿÿÿÿ^M
Ark
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Ersätze für Java-Scanner Java Basics - Anfänger-Themen 9
D nextInt() nicht für Scanner definiert? Java Basics - Anfänger-Themen 2
T Scanner für char-wert/ if mit 2 bedingungen? Java Basics - Anfänger-Themen 5
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
M Scanner Input mit if überprüfen Java Basics - Anfänger-Themen 5
D Scanner Java Basics - Anfänger-Themen 2
T scanner nicht erkannt Java Basics - Anfänger-Themen 3
T scanner eingaben erkennen und umtauschen Java Basics - Anfänger-Themen 4
Ostkreuz Int Scanner auf Enter Eingabe prüfen Java Basics - Anfänger-Themen 4
H Scanner nextLine() bringt Dateipfad Java Basics - Anfänger-Themen 1
Jul1n4tor Scanner error bei Eingabe die kein Integer ist Java Basics - Anfänger-Themen 4
Jul1n4tor Programm mit Scanner und If-Statements Java Basics - Anfänger-Themen 2
I Scanner Loop Java Basics - Anfänger-Themen 1
J Scanner cannot be resolved to a type Java Basics - Anfänger-Themen 3
C Scanner und If-Anweisung in Kombi Java Basics - Anfänger-Themen 3
X Erste Schritte Scanner eingabe wird übersprungen Java Basics - Anfänger-Themen 4
T j.u.Scanner(Sys.in).nextLine() wieder schließen? Java Basics - Anfänger-Themen 5
J Erste Schritte Scanner Java Basics - Anfänger-Themen 4
P Mit dem Scanner Klassen aufrufen Java Basics - Anfänger-Themen 3
javapingu Endlosschleife bei User Input mit try Scanner Java Basics - Anfänger-Themen 7
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
Poppigescorn Arrayliste Mittels Scanner erweitern Java Basics - Anfänger-Themen 6
Jan_x8 Timer/Scanner Java Basics - Anfänger-Themen 5
M Scanner Klasse Java Basics - Anfänger-Themen 4
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
F Erste Schritte java.util.Scanner: Beliebig langen Text per Paste in Console eingeben ? Java Basics - Anfänger-Themen 14
H Quellcode Scanner Klasse Java Basics - Anfänger-Themen 2
N java.util.InputMismatchException Fehler Java Scanner Java Basics - Anfänger-Themen 5
S Scanner soll Groß-/ Kleinschreibung ignorieren Java Basics - Anfänger-Themen 2
Y Wie kann ich Konsoleneingaben durch den Scanner mit JUnit 4 testen? Java Basics - Anfänger-Themen 1
J Scanner-Klasse Java Basics - Anfänger-Themen 2
B Scanner-If/else kleine Abhebungs-Simulation Java Basics - Anfänger-Themen 3
A Scanner Befehl Java Anfänger Java Basics - Anfänger-Themen 8
D Scanner- Exception NoSuchElementException Java Basics - Anfänger-Themen 2
G Scanner nutzen und Index auslesen Java Basics - Anfänger-Themen 8
N Problem mit Scanner Java Basics - Anfänger-Themen 2
P Methode die eigentlich einen Scanner benötigt mit toString() Java Basics - Anfänger-Themen 5
A Scanner-Error Java Basics - Anfänger-Themen 8
D Java Scanner Java Basics - Anfänger-Themen 9
M String in Scanner einlesen Java Basics - Anfänger-Themen 6
N Eingabe Kommazahlen über Scanner Java Basics - Anfänger-Themen 2
ZH1896ZH Verstehe verschieden Scanner und hasNext() nicht ganz Java Basics - Anfänger-Themen 2
O Mehrfache Scanner-Eingabe durch Komma getrennt Java Basics - Anfänger-Themen 6
I Scanner auf 10 Stellen begrenzt? Java Basics - Anfänger-Themen 5
B Barcode Scanner Java Basics - Anfänger-Themen 3
V Wie lasse ich die for-Schleife so oft laufen wie per Scanner angegeben? Java Basics - Anfänger-Themen 3
L Scanner schließen in While-Schleife? Java Basics - Anfänger-Themen 2
S Scanner Java Basics - Anfänger-Themen 36
S Frage zu Scanner Java Basics - Anfänger-Themen 3
cpt.Tomato Scanner problem mit Passwort Login Java Basics - Anfänger-Themen 3
O Scanner Klasse Java Basics - Anfänger-Themen 8
M java.util.scanner Fehler Java Basics - Anfänger-Themen 5
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
W Eclipse Che Scanner Java Basics - Anfänger-Themen 8
H Vererbung Static Scanner Objekt verwenden - von StdIn in einer importierten Klasse lesen Java Basics - Anfänger-Themen 10
X Erste Schritte Problem mit scanner Java Basics - Anfänger-Themen 2
A Scanner.useLocale(Locale.US); Java Basics - Anfänger-Themen 4
M Datei einlesen mit Scanner funktioniert nicht (FileNotFoundException) Java Basics - Anfänger-Themen 6
I Scanner und Arrays Java Basics - Anfänger-Themen 2
M Scanner-Eingabe nach gewissem Zeitraum überprüfen Java Basics - Anfänger-Themen 2
Neoline Methoden Scanner Methode Java Basics - Anfänger-Themen 9
E Probleme mit Scanner Java Basics - Anfänger-Themen 4
A Java Scanner Funktioniert nicht Java Basics - Anfänger-Themen 2
B Vom scanner in ein Arraylist Java Basics - Anfänger-Themen 7
L Scanner Ausgabe Java Basics - Anfänger-Themen 37
S Zeilenumbruch mit Scanner erkennen Java Basics - Anfänger-Themen 9
O Erste Schritte Scanner mehrere male benutzen (Konsole) Java Basics - Anfänger-Themen 7
W Wie arbeite ich mit dem Typ Scanner? Java Basics - Anfänger-Themen 5
J Input/Output Scanner Input als etwas einsetzen Java Basics - Anfänger-Themen 3
R CMDTools Scanner Fehler Java Basics - Anfänger-Themen 10
N Operatoren Suchen nach einer bestimmten Eingabe (durch Scanner) Java Basics - Anfänger-Themen 7
F Scanner Problem Java Basics - Anfänger-Themen 8
T Variablen Array mit Scanner befüllen Java Basics - Anfänger-Themen 6
C Java Scanner einlesen von txt Dokument InputMismatch Java Basics - Anfänger-Themen 9
b1ck Scanner schließen, erneute Verwendung Java Basics - Anfänger-Themen 12
F Scanner - nextLine() gibt leeren String zurück Java Basics - Anfänger-Themen 2
T Problem mit Scanner. Java Basics - Anfänger-Themen 4
J Methode über Scanner aufrufen Java Basics - Anfänger-Themen 15
J Erste Schritte Scanner negative zahl einlesen und verwenden. Java Basics - Anfänger-Themen 6
W Methoden Probleme mit der Scanner Methode Java Basics - Anfänger-Themen 2
Silvascus Scanner Problem Java Basics - Anfänger-Themen 5
W Erste Schritte import java.util.scanner funktioniert nicht Java Basics - Anfänger-Themen 2
TheMenox Error bei Scanner - woher? Java Basics - Anfänger-Themen 14
D Fehler bei String eingabe via Scanner Java Basics - Anfänger-Themen 6
F Problem do while Schleife und Scanner Java Basics - Anfänger-Themen 2
O POI Apache sheet scanner Java Basics - Anfänger-Themen 1
A regulären Ausdruck mit Hilfe der Klasse Scanner in einem String finden Java Basics - Anfänger-Themen 2
F Array mit Scanner-Werten Java Basics - Anfänger-Themen 4
M Input/Output Scanner schließt nicht Java Basics - Anfänger-Themen 2
M Scanner class Java Basics - Anfänger-Themen 6
K Mit Scanner aus einer txt Datei lesen und jede Person mit name, vorname, geburtsdatum speichern Java Basics - Anfänger-Themen 5
S Array mit "foreach"-Schleife und nextInt (aus Scanner) beschreiben Java Basics - Anfänger-Themen 6
G Strings mit Scanner (nextLine) einlesen Java Basics - Anfänger-Themen 7
Q Scanner auf eine Zahl beschränken Java Basics - Anfänger-Themen 2
S Sonderzeichen '|' (u007C) mit Scanner einlesen Java Basics - Anfänger-Themen 1
T Scanner lässt sich nicht importieren Java Basics - Anfänger-Themen 1
R scanner in String funktioniert nicht Java Basics - Anfänger-Themen 1
P scanner ein Double einlesen Java Basics - Anfänger-Themen 10
A InputMismatchException mit Scanner Java Basics - Anfänger-Themen 6
J scanner, String einlesen und vergleichen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben