Mit Scanner-Klasse eine Datei zeilenweise einlesen und nur bestimmte Zeichen abfragen

Status
Nicht offen für weitere Antworten.

Jay1980

Bekanntes Mitglied
Servus,

ich habe eine Datei die lese ich via Scanner und Schleife zeilenweise ein - passt.
Erwartet wird eine Zeile mit
123 456

Jetzt haben aber bestimmte Testdateien, Störkommentare drin, etwas #ha 123 456, oft in der ersten Zeile und einmal auch mitten drin, wie mache ich das, dass meine Zeilenscanner immer wenn er mit nextInt() scheitert die Zeile einfach überspringt. Ich las es gibt eine Skip-Methode, die einen String oder ein Pattern aufnimmt. Da ich Novize bin, bin ich für eine Hilfe dankbar.

Java:
// Punkte laden
		ArrayList<Point> tempPunkte = new ArrayList<Point>();
		
		File fileToRead = new File( fileName );
		
		// String einlesen über Scanner+File-Objektkombo
		Scanner scanner;
		try {
			scanner = new Scanner( fileToRead );
			while( scanner.hasNextLine() == true )
			{
				// TODO Test Datei kommentar.test nicht bestanden
				// Umgang mit anderen Sachen, die Zeile rausfeuern
				
				int x = 0;
				int y = 0;
				
				// 34 456 erwartet
				if ( scanner.hasNextInt() == true )
				{
					x = scanner.nextInt();
				}
				
				if ( scanner.hasNextInt() == true )
				{
					y = scanner.nextInt();
				}
				
				if ( x == 0 && y == 0 )
				{
					// Zeilenumbruch am Ende
					break;
				}
				Point currentPoint = new Point( x, y );
				tempPunkte.add(currentPoint);
			}
			
			if ( punkte != null ) 
			{ 
				punkte.clear();
				punkte.addAll(tempPunkte);
			}
			
		} catch (FileNotFoundException exc) {
			// TODO Auto-generated catch block
			exc.printStackTrace();
		} catch (IOException exc) {
			// TODO Auto-generated catch block
			exc.printStackTrace();
		}
 

Atze

Top Contributor
wenn deine liste nicht homogen ist, also nicht ausschließlich ints enthält, dann bleibt dir nix übrig dir objekte zu holen und zu casten.
 

Jay1980

Bekanntes Mitglied
Meine Liste ist homogen, wenn du damit meinst, dass da nur Point-Objekte drin sind.
Was meinst du mit casten, ich dachte eher daran, dass ich da irgendwo eine if -Abfrage einbauen muss, ob ein Token nur Ziffern beinhaltet - ich kann aus deinem Tipp nicht ableiten was ich machen soll, sorry.
 

Atze

Top Contributor
sorry, hab mich wphl nicht richtig ausgedrückt, außerdem ha ich mich auch n bischen vertan. ich nahm an, dass die methode next() ein object zurückgibt. sie gibt aber einen string, was aber auch nicht weiter schlimm ist. du musst dann wohl statt der methode nextInt() die methode next() aufrufen und versuchen den string in eine zahl zu parsen. vorher solltest du wie gesagt noch gucken, ob dies möglich ist, vielleicht mit nem regulären ausdruck.
 

Jay1980

Bekanntes Mitglied
Servus,

ich habe nun nochmal das Kapitel Strings und deren Anwendung in der Insel überflogen. Es gibt sehr viele Möglichkeiten wie mir scheint, leider steh ich weiterhin ziemlich auf dem Schlauch, was die Umsetzung von 'huepfe eine Zeile weiter, wenn die Zeile nicht

inteins intzwei

aufgebaut ist. Ich glaube da hilft mir zum Verständnis auch nur die konkrete if-Abfrage die ich vor den hasNextInt() Blöcken schreiben muss, die mir in die nächste Iteration springt - diese Lösung kann ich dann durchdenken und nachvollziehen. hasNextInt() macht soweit ich das beurteilen kann genau, das was du gesagt hast Atze, also via next() den Token liefern lassen und in einen Integer parsen.
 

Atze

Top Contributor
ja, nextInt macht das, aber du weißt ja nicht, ob du immer nen string hast, den du parsen kannst. und kommt eine zeichenkette, fliegt er raus. deswegen sofort den string nehmen und selbst gucken, ob es eine zahl sein kann.
dass du halt so komische strings drin hast, das meinte ich mit nicht-homogen
 
B

bygones

Gast
mal ehrlich... versteht einer diese skip Methode ?

wuerde mich auch brennend interessieren. Sie einfach mal zu rufen ist ja kein Problem aber geht das ueberhaupt in einer schleife ?

wuesste auch nix anderes als einfach ueber next() alles einlesen und schauen ob es eine Zahl ist
 

Jay1980

Bekanntes Mitglied
Kann mir bitte einer diese eine Zeile als Code posten (das einfach über next() einlesen und schauen ob es eine Zahl ist) - danke.
 
Zuletzt bearbeitet:

Atze

Top Contributor
Java:
String stringX = scanner.next();
if(stringX.matches("(-?)(\\d+)")){
	int intX = Integer.parseInt(stringX);
}
 

Jay1980

Bekanntes Mitglied
Servus, es geht langsam weiter mit meiner Einleseaktion, jetzt kann ich mir folgendes nicht erklären: die erste Zeile wird wie geplant uebersprungen nachdem das erste Zeichen ein '#' ist. Die zweite Zeile wird dann ja geliefert. Nun sagt mir Eclipse in dieser Zeile liegen '100 100\n', also sollte daraus eigentlich der Punkt(100, 100) gebastelt werden. Aber obwohl in dieser Zeile gar kein 200 vorkommt, ist y 200 statt 100 - mir unerklärlich. Es scheint daran zu liegen, dass da irgendwas mit nextInt() ist, was ich nicht vorhersehe - ich dachte, das erste nextInt() liefert mir die 100 und der zweite nextInt() die zweite 100 ?!

Hier die Textdatei aus der gelesen wird:
# 90 90
100 100
100 200
90 XXXX 210
200 200
200 100
230
90

Hier meine Einlese-Methode:

Java:
LaedtPunktemengeAusDateiK(Punktemenge pm, AktionsManager am)
	{
		// Punkte laden
		ArrayList<Punkt> tempPoints = new ArrayList<Punkt>();
		
		JFileChooser fc = new JFileChooser();
		int state = fc.showOpenDialog(null);
		
		if ( state == JFileChooser.APPROVE_OPTION )
		{
			File fileToRead = fc.getSelectedFile();
			// String einlesen über Scanner+File-Objektkombo
			Scanner scanner;
			try {
				scanner = new Scanner( fileToRead );
				while( scanner.hasNextLine() == true )
				{
					int x = 0;
					int y = 0;
					// 34 456 erwartet
					
					// sammle alle Zeichen in einem Array
					// und wenn eines dabei ist, dass weder Leerzeichen noch Ziffer ist, 
					// springe in die naechste Zeile
					String zeilenZeichen = scanner.nextLine();
					
					// Abbruchbedingungen vor der Zuweisung
					
					// es ist nur das abschliessende Zeilenumbruchzeichen
					if ( zeilenZeichen.length() == 1 && Character.isDigit('\n'))
					{
						// an den Schleifenkopf springen und danach wird die Schleife ohnehin nicht mehr ausgefuehrt
						continue;
					}
					
					// ein anderes Zeichen als Leerzeichen, Zeilenumbruch oder Ziffer
					boolean zeilenSprung = false;
					
					for ( int i = 0; i < zeilenZeichen.length(); i++ )
					{
						char aktuellesZeichen = zeilenZeichen.charAt(i);
						
						// Debugging um das Zeichen auf linebreak zu pruefen
						if ( aktuellesZeichen == '\n' && zeilenZeichen.length() == 1 )
						{
							System.out.println("Leerzeichen-Only-String erkannt.");
						}
						
						
						if ( Character.isDigit(aktuellesZeichen) == false && Character.isWhitespace(aktuellesZeichen) == false  && aktuellesZeichen != '\n' )
						{
							zeilenSprung = true;
							break;
						}
					}
					
					if ( zeilenSprung == true )
					{
						continue;
					}
					
					if ( scanner.hasNextInt() == true )
					{
						x = scanner.nextInt();
						System.out.println();
					}
					if ( scanner.hasNextInt() == true )
					{
						y = scanner.nextInt();
						System.out.println();
					}
					
					Punkt currentPoint = new Punkt( x, y );
					tempPoints.add(currentPoint);
				}
				
				pm.addPunkte(tempPoints);
				am.meldeNeueAktion(pm);
				// Zeichenflaeche wird in der NutzerAS-Instanz revalidated und repainted.
				
			} catch (FileNotFoundException exc) {
				// TODO Auto-generated catch block
				exc.printStackTrace();
			} catch (IOException exc) {
				// TODO Auto-generated catch block
				exc.printStackTrace();
			}
		}
	}
Danke für einen Tipp.
 

Atze

Top Contributor
du kannst ja auch nicht nextLine() und nextInt() (dies sogar 2 mal :)) aufrufen und erwarten, dass du den gleichen wert wiederbekommst! :)

du rufst erst nextLine auf, bekommst 100 100, überprüfst diese auf das #, und um dann an die beiden 100er zu kommen rufst du nextInt auf. dann bekommst du aber schon die auf der nächsten zeile. du hast den string doch schon in aktuellesZeichen. du musst dann nur noch am leerzeichen dazwischen teilen
 

Jay1980

Bekanntes Mitglied
Sodala,

jetzt gings, ich nutze nun den Scanner zum zeilenweisen einlesen, dann hau ich den Zeilenstring mit dem Tokenizer beim Leerzeichen auseinander und parse die Teilstuecke in einen Integer, aus dem ich denn später einen Punkt baue.
Dabei gibt es ein paar if-Abfragen, damit keine Exceptions auftreten.

Für Optimierungen bin ich natürlich dankbar, markiere den Thread trotzdem mal als gelöst.

Java:
	LaedtPunktemengeAusDateiK(Punktemenge pm, AktionsManager am)
	{
		// Punkte laden
		ArrayList<Punkt> tempPoints = new ArrayList<Punkt>();
		
		JFileChooser fc = new JFileChooser();
		int state = fc.showOpenDialog(null);
		
		if ( state == JFileChooser.APPROVE_OPTION )
		{
			File fileToRead = fc.getSelectedFile();
			// String einlesen über Scanner+File-Objektkombo
			Scanner scanner;
			try {
				scanner = new Scanner( fileToRead );
				while( scanner.hasNextLine() == true )
				{
					int x = 0;
					int y = 0;
					// 34 456  in einer Zeile erwartet
					
					// sammle alle Zeichen einer Zeile in einem Array
					String zeilenZeichen = scanner.nextLine();
					
					// ------------------------------------------
					// Abbruchbedingungen fuer eine Zeile
					// ------------------------------------------
					
					// es ist nur das abschliessende Zeilenumbruchzeichen im String, 
					// wie bei den Dateien die mit einem zusaetzlichen Zeilenumbruch schliessen
					if ( zeilenZeichen.length() == 1 && Character.isWhitespace('\n'))
					{
						// an den Schleifenkopf springen und danach wird die Schleife ohnehin nicht mehr ausgefuehrt
						continue;
					}
					
					// ein anderes Zeichen als Leerzeichen, Zeilenumbruch oder Ziffer
					// ist im String
					boolean zeilenSprung = false;
					
					for ( int i = 0; i < zeilenZeichen.length(); i++ )
					{
						char aktuellesZeichen = zeilenZeichen.charAt(i);
						
						// ein Zeichen ist eine Ziffer, ein Leerzeichen oder ein 
						// Zeilenumbruch, gehe dann einfach weiter und meckere nicht
						if ( Character.isDigit(aktuellesZeichen) == false && Character.isWhitespace(aktuellesZeichen) == false  && aktuellesZeichen != '\n' )
						{
							zeilenSprung = true;
							break;
						}
					}
					
					if ( zeilenSprung == true )
					{
						continue;
					}
					
					// Einsammeln der ersten beiden Tokens
					StringTokenizer tokenizer = new StringTokenizer(zeilenZeichen, " "); 
					
					
					// Zahl aus erstem Token, wenn die Tokenlaenge groesser 0 ist und wenn ein naechster Token vorhanden ist
					boolean tokenEinsDa = false;
					if ( tokenizer.hasMoreTokens())
					{
						String ersterToken = tokenizer.nextToken();
						if ( ersterToken.length() > 0 ) 
						{
							x = Integer.parseInt( ersterToken);
							tokenEinsDa = true;
						}
						else 
						{
							// keine ganze Zahl möglich, nextLine
							continue;
						}
					}
					
					boolean tokenZweiDa = false;
					if ( tokenizer.hasMoreTokens() )
					{
						String zweiterToken = tokenizer.nextToken();
						if ( zweiterToken.length() > 0 )
						{
							// Zahl aus zweitem Token
							y = Integer.parseInt( zweiterToken );
							tokenZweiDa = true;
						}
						else 
						{
							// keine ganze Zahl möglich, nextLine
							continue;
						}
					}
					
					// Zuweisung wenn beide Tokens da sind
					if ( tokenEinsDa == true && tokenZweiDa == true )
					{
						Punkt currentPoint = new Punkt( x, y );
						tempPoints.add(currentPoint);
					}
				}
				
				pm.addPunkte(tempPoints);
				am.meldeNeueAktion(pm);
				// Zeichenflaeche wird in der NutzerAS-Instanz revalidated und repainted.
				
			} catch (FileNotFoundException exc) {
				// TODO Auto-generated catch block
				exc.printStackTrace();
			} catch (IOException exc) {
				// TODO Auto-generated catch block
				exc.printStackTrace();
			}
		}
	}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
J NetBeans Frage bezüglich der Scanner-Klasse Allgemeine Java-Themen 6
H Problem mit Scanner Klasse Allgemeine Java-Themen 7
E Wie Zeichen eingeben mit Klasse Scanner? Allgemeine Java-Themen 5
S Die Methode close() der Klasse Scanner Allgemeine Java-Themen 3
X Input/Output InputStream/Scanner(System.in) read()/hasNextLine() block unterbrechen Allgemeine Java-Themen 7
J Variablen Scanner als Klassenvariable Allgemeine Java-Themen 5
M Kein Scanner Fehler durch falsche EIngabe Allgemeine Java-Themen 4
Bluedaishi Twain Scanner im Netzwerk Allgemeine Java-Themen 10
B Scanner erkennt keinen Text in Textdatei, obwohl welcher drinsteht Allgemeine Java-Themen 10
J Scanner oder BufferReader Allgemeine Java-Themen 2
1 Java Scanner Allgemeine Java-Themen 2
A Scanner Variable Klassenimtern deklarieren Allgemeine Java-Themen 12
T Datentypen Scanner Allgemeine Java-Themen 4
A Erste Schritte If Abfragen + Scanner Allgemeine Java-Themen 7
P Input/Output java.util.Scanner in einer Schleife und Exception-Behandlung: Einlesen einer Zahl Allgemeine Java-Themen 4
D Arraylist/For Schleife/Scanner Allgemeine Java-Themen 30
P Input/Output Datei einlesen per Scanner(f) - mit Cron gehts nicht Allgemeine Java-Themen 1
S Erste Schritte Scanner in Methode einbauen Allgemeine Java-Themen 4
B QR Scanner WebCam Allgemeine Java-Themen 2
P Scanner als Inputstream für Java Prozess Allgemeine Java-Themen 4
H Scanner: Ausgabe erst nach Abbruch Allgemeine Java-Themen 8
S Bekomme mit Scanner und URL keine Html-Seite ausgelesen Allgemeine Java-Themen 3
H Scanner soll einen Inputredirect einlesen, liest aber nicht jedes Wort ein. Allgemeine Java-Themen 3
Ark Locale, Formatter und Scanner: Bug bei Gleitkommazahlen? Allgemeine Java-Themen 2
X Scanner hört nach der 25. Zeile auf Allgemeine Java-Themen 6
A Split, Scanner, StringTokenizer oder PatternMatching für flexibles Dateieinlesen? Allgemeine Java-Themen 2
D java.util.InputMismatchException im Scanner -wieso? Allgemeine Java-Themen 5
K Scanner - große Textfile, nur 0 ab betim. Wert Allgemeine Java-Themen 4
D Scanner leer aber bufferedReader nicht?! Allgemeine Java-Themen 2
N Scanner läuft nicht durch Allgemeine Java-Themen 2
R Scanner mit Java Allgemeine Java-Themen 2
J Parser / Scanner / Tokenizer gesucht Allgemeine Java-Themen 3
J Problem mit Scanner-Stream Allgemeine Java-Themen 2
M Scanner-Methode: Mehrere Eingaben mit Exception behandeln Allgemeine Java-Themen 10
R Barcode Scanner mit JavaPos ansprechen Allgemeine Java-Themen 1
M Barcode-Scanner unterscheidung zur Tastertur Allgemeine Java-Themen 7
D Problem mit java.util.scanner: Falsche Ergebnisse Allgemeine Java-Themen 4
E Scanner Frage :) Allgemeine Java-Themen 8
A Unterschied Scanner und Matcher Allgemeine Java-Themen 5
S Problem mit Scanner Allgemeine Java-Themen 5
G Barcode (Strichcode)-Scanner Allgemeine Java-Themen 10
G Scanner.hasNext() beendet den Thread ohne Message Allgemeine Java-Themen 4
S Scanner Allgemeine Java-Themen 6
G Scanner-Generator zur Erkennung von Java Tokens Allgemeine Java-Themen 7
B Try/Catch in While-Schleife mit Scanner - Hilfe! Allgemeine Java-Themen 3
K Scanner.hasNext findet kein Ende Allgemeine Java-Themen 6
D ProcessBuilder und Scanner Probleme mit einigen Prozessen Allgemeine Java-Themen 2
G Scanner und Abbruchbedingung/Pattern Allgemeine Java-Themen 2
bernd java.util.Scanner erst ab Java 1.5? Allgemeine Java-Themen 4
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
kanywayne Java programmieren: Polynom Klasse Allgemeine Java-Themen 4
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
C Klasse mit Mockito simulieren Allgemeine Java-Themen 9
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Thallius Key/Value Table in Klasse einlesen Allgemeine Java-Themen 14
S static in Interface und Klasse Allgemeine Java-Themen 2
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D javassist API Klasse in MethodCall ermitteln Allgemeine Java-Themen 8
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
J Builder Klasse mit Lombok bauen Allgemeine Java-Themen 2
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
M [SOAP] - Klasse aus WSDL ausschließen Allgemeine Java-Themen 2
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
X Klassen Klasse BreakIterator Allgemeine Java-Themen 6
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
M Matcher-Klasse findet match nicht Allgemeine Java-Themen 6
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
M Kapselung Modellierung von Intervallen: Klasse Interval Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
J IndexOutOfBoundsException bei der Nutzung der Klasse Message von mime4j Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben