2016-10-26 4 views
1

Ich habe eine Datei im Format .dat. Hier ist ein BeispielJava Scanner Delimiter auf Werte von NextLine

|| = (N) = || 1 || 0,938 || --- || 0,5 || (****) || 0,5 || 0 || 0 || 0 || 0.700 || (p) = 2212, (n) = 2112 ||

|| = (\ Delta) = || 2 || 1.232 || 0,118 || 1.5 || (****) || 1.5 || 0 || 0 || 3 || 1.076 || (\ Delta^{++}) = 2224, (\ Delta^+) = 2214, (\ Delta^0) = 2114, (\ Delta^-) = 1114 ||

|| = (P_ {11} (1440)) = || 3 || 1.462 || 0,391 || 0,5 || (****) || 0,5 || 0 || 0 || 3 || 1.076 || 202212, 202112 ||

|| = (S_ {11} (1535)) = || 4 || 1.534 || 0.151 || 0,5 || (***) || 0,5 || 0 || 0 || 3 || 1.076 || 102212, 102112 ||

Ich versuche Scanner zu verwenden, um diese Datei zu lesen und die Zeile durch die "||" und dann in und ArrayList für die zukünftige Verarbeitung senden. Hier ist ein Beispiel von meinem Code, wo ich verwende, um den Begrenzer

String file = "data.dat"; 
Scanner s = null; 
try { 
    s = new Scanner(new File(file)).useDelimiter("\\|\\|"); //here is the use of my delimiter 

    ArrayList<String> list = new ArrayList<String>(); 
    while (s.hasNextLine()) { //notice I am using hasNextLine because each line must be unique to create the HashMap 
     list.add(s.nextLine()); 
    } 
    s.close(); 
    for (String string : list) { //Lets print out the values of the list 
     System.out.println(string); 
    } 
} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Aber mein Ausgang noch Werte des Trennzeichens hat, das heißt hier die Ausgabe:

|| = (N) = || 1 || 0,938 || --- || 0,5 || (****) || 0,5 || 0 || 0 || 0 || 0.700 || (p) = 2212, (n) = 2112 ||

|| = (\ Delta) = || 2 || 1.232 || 0,118 || 1.5 || (****) || 1.5 || 0 || 0 || 3 || 1.076 || (\ Delta^{++}) = 2224, (\ Delta^+) = 2214, (\ Delta^0) = 2114, (\ Delta^-) = 1114 ||

|| = (P_ {11} (1440)) = || 3 || 1.462 || 0,391 || 0,5 || (****) || 0,5 || 0 || 0 || 3 || 1.076 || 202212, 202112 ||

|| = (S_ {11} (1535)) = || 4 || 1.534 || 0.151 || 0,5 || (***) || 0,5 || 0 || 0 || 3 || 1.076 || 102212, 102112 ||

Ich habe gesucht und keine Antwort gefunden, die geholfen hat. Ich bin auch eine Warnung über einen Sehen „Ressourcenleck:‚‘ist nie geschlossen“ mit der Linie

s = new Scanner(new File(file)).useDelimiter("\\|\\|"); 

, die verschwindet, wenn die Leitung in

s = new Scanner(new File(file)); 
s.useDelimiter("\\|\\|"); 

gebrochen Jede Hilfe sehr geschätzt wird.

+0

Versuchen Sie, 'next()' anstelle von 'nextLine()' zu verwenden. Das liegt daran, dass eine Zeile nicht unbedingt mit '||' endet. – progyammer

+0

@progy_rock nextLine ist wichtig, da jede Zeile ein Array von Werten ist, die ich später sortieren muss. Mit next() wird die Platzierung der Identität verloren. – mkunkel

+0

Warum lesen Sie nicht jede Zeile mit Ihrem Scanner ohne Trennzeichen. Und dann verwenden Sie String.split in jeder Zeile mit Ihrem Delimiter? – ArcticLord

Antwort

2

Sie müssen Backslash-Escape nicht verwenden. anstelle von \\|\\| als Trennzeichen, teilen Sie einfach die Zeichenfolge nach dem Lesen aus der Datei.

Dies sollte es beheben.

+0

Ich habe Ihre Empfehlung geändert und das hat nicht funktioniert. Ich bekomme die gleiche Ausgabe wie zuvor. – mkunkel

+0

nur eine Sekunde. Testen Sie es erneut – ItamarG3

+0

Ich sehe, was Sie dort getan haben. Ich brauche nextLine(), nicht next(). Später werde ich die Werte des Arrays für jede Zeile mit einer Logik vergleichen. Also brauche ich nextLine(). – mkunkel

1

Sie können nur die Zeile ohne Trennzeichen lesen und dann || mit der gewünschten Methode replace ersetzen.

-Code

public static void main (String[] args) throws java.lang.Exception{ 
    Scanner s = new Scanner(System.in); 
    ArrayList<String> list = new ArrayList<String>(); 

    while (s.hasNextLine()) { 
    String newLine = s.nextLine().replace("||",""); 
     list.add(newLine); 
     // or just like this 
     //list.add(s.nextLine().replace("||","")); 
    } 
    s.close(); 

    for (String string : list) { 
     System.out.println(string); 
    } 
} 

Überprüfen Sie die Ausgabe here.

+0

ja, das würde auch funktionieren. Vielen Dank. – mkunkel

+0

@mkunkel Mein Vergnügen, beachten Sie, dass Sie innere for-Schleife vermeiden können, wenn Sie Ersetzen anstelle von Teilen verwenden und die Leistung für große Datei erhöhen kann. – Ravikumar