2015-04-24 5 views
5

Ich muss ein Programm schreiben, das Baseball-Spieler Informationen und Treffer, aus, gehen, ect aus einer TXT-Datei analysieren wird. Zum Beispiel kann die TXT-Datei in etwa so aussehen: Sam Slugger, h, h, o, s, w, w, h, w, o, o, o, h, s Jill Jenks, o, o, s, h, h, o, o Will Jones, o, o, w, h, o, o, o, o, w, o, oParsing txt-Datei

Ich weiß, wie man die Datei analysiert und kann diesen Code perfekt laufen lassen . Das einzige Problem, das ich habe, ist, dass wir nur den Namen für jeden Spieler und 3 oder ihre Spiele drucken sollten. Zum Beispiel: Sam Slugger Hit, Hit, aus Jill Jenks out, out, opfern Will Jones out, out fliegen, gehen

Ich bin nicht sicher, wie dieses und jedes Mal, wenn ich es versuchen zu begrenzen abzuschneiden an 3 Ich bekomme immer die erste Person in Ordnung, aber es bricht die Schleife und tut nichts für alle anderen Spieler. Diese

ist das, was ich bisher:

import java.util.Scanner; 
import java.io.*; 

public class ReadBaseBall{ 

public static void main(String args[]) throws IOException{ 

    int count=0; 
    String playerData; 
    Scanner fileScan, urlScan; 

    String fileName = "C:\\Users\\Crust\\Documents\\java\\TeamStats.txt"; 
    fileScan = new Scanner(new File(fileName)); 

    while(fileScan.hasNext()){ 

     playerData = fileScan.nextLine(); 
     fileScan.useDelimiter(","); 

     //System.out.println("Name: " + playerData); 

     urlScan = new Scanner(playerData); 
     urlScan.useDelimiter(","); 


     for(urlScan.hasNext(); count<4; count++) 

      System.out.print(" " + urlScan.next() + ","); 

     System.out.println(); 

     } 
    } 
} 

Dies gibt: Sam Slugger, h, h, o, aber dann werden die anderen Spieler für ungültig erklärt werden. Ich brauche Hilfe, um auch die anderen zu drucken.

+0

Haben Sie die Kontrolle über das Dateiformat? –

+0

Leider nein. Die Datei soll das Potenzial haben, unendlich zu sein. Es könnte so viele Spieler geben, wie die Datei darin hat. – cweidner55

+0

Sie müssen Ihre 'count' Variable zurücksetzen, sehen Sie sich meine Antwort unten an. – Phoenix

Antwort

0

Erstes Problem

ändern while(fileScan.hasNext())) zu while(fileScan.hasNextLine()). Kein Problem, aber wenn Sie einen Scanner verwenden, setzen Sie normalerweise sc.* direkt nach einem sc.has*.

Zweites Problem

Entfernen Sie die Zeile fileScan.useDelimiter(","). Diese Zeile führt in diesem Fall nichts aus, ersetzt jedoch das Standardbegrenzungszeichen, sodass der Scanner nicht mehr in Whitespaces aufgeteilt wird. Was bei der Verwendung von Scanner.nextLine keine Rolle spielt, kann aber später einige schlimme Nebenwirkungen haben.

Drittes Problem

Ändern Sie diese Zeile for(urlScan.hasNext(); count<4; count++) zu while(urlScan.hasNext()). Ehrlich gesagt bin ich überrascht, dass diese Zeile sogar kompiliert wurde und wenn es das tat, nur die ersten 4 vom Scanner gelesen.

Wenn Sie den Betrag für jede Zeile verarbeitet begrenzen möchten, können Sie es ersetzen mit

for(int count = 0; count < limit && urlScan.hasNext(); count++)

Dadurch wird die Menge an limit lesen begrenzen, während immer noch Linien Handhabung, die weniger Daten als die Grenze haben.

Stellen Sie sicher, dass jeder Ihrer Datensätze durch eine Zeile getrennt ist, da die Ausgabe sonst nicht sinnvoll ist.

0

Sie benötigen count Auto in der while-Schleife zurück:

while(fileScan.hasNext()){ 
     count = 0; 
     ... 
} 
0

Sie nicht mehrere Scanner auf diese haben sollte - vorausgesetzt, das Format, das Sie in Ihrer Frage gestellt Sie reguläre Ausdrücke, dies zu tun verwenden können.

Dies zeigt einen regulären Ausdruck, der einem Player entspricht und als Trennzeichen für den Scanner verwendet wird. Ich fütterte den Scanner in meinem Beispiel eine Zeichenfolge, aber die Technik ist unabhängig von der Quelle gleich.

int count = 0; 
Pattern playerPattern = Pattern.compile("\\w+\\s\\w+(?:,\\w){1,3}"); 
Scanner fileScan = new Scanner("Sam Slugger,h,h,o,s,w,w,h,w,o,o,o,h,s Jill Jenks,o,o,s,h,h,o,o Will Jones,o,o,w,h,o,o,o,o,w,o,o"); 
fileScan.useDelimiter("(?<=,\\w)\\s"); 

while (fileScan.hasNext()){ 
    String player = fileScan.next(); 
    Matcher m = playerPattern.matcher(player); 
    if (m.find()) { 
     player = m.group(0); 
    } else { 
     throw new InputMismatchException("Players data not in expected format on string: " + player); 
    } 
    System.out.println(player); 
    count++; 
} 
System.out.printf("%d players found.", count); 

Output:

Sam Slugger,h,h,o 
Jill Jenks,o,o,s 
Will Jones,o,o,w 

Der Aufruf von Scanner.delimiter() setzt den Begrenzer für das Abrufen von Token zu verwenden. Die Regex (?<=,\\w)\\s:

(?<        // positive lookbehind 
    ,\w       // literal comma, word character 
) 
\s        // whitespace character 

die die Spieler durch den Raum zwischen den Einträgen begrenzt, ohne aber dieser Raum alles übereinstimmt, und nicht den Raum zwischen den Namen übereinstimmen.

Der reguläre Ausdruck zu extrahieren bis zu 3 Stücke pro Spieler ist \\w+\\s\\w+(?:,\\w){1,3} verwendet:

\w+        // matches one to unlimited word characters 
(?:        // begin non-capturing group 
    ,\w       // literal comma, word character 
){1,3}       // match non-capturing group 1 - 3 times 
+0

Danke Jungs, diese Antworten haben wirklich geholfen und jetzt habe ich es funktioniert. – cweidner55

+0

@ cweidner55 Wenn diese Antwort Ihr Problem gelöst hat, klicken Sie auf den grünen Haken. – Voldemort

1

Hier probieren Sie doch einmal mit Filereader Ihr Dateiinhalt Format wie diese mit

Sam Slugger,h,h,o,s,w,w,h,w,o,o,o,h,s 
Jill Johns,h,h,o,s,w,w,h,w,o,o,o,h,s 

ist Unter der Annahme, jeder Spieler in seiner/ihrer eigenen Linie dann kann dies für Sie arbeiten

BufferedReader reader; 
    try { 
     reader = new BufferedReader(new FileReader(new File("file.txt"))); 
     String line = ""; 
     while ((line = reader.readLine()) != null) { 
      String[] values_per_line = line.split(","); 
      System.out.println("Name:" + values_per_line[0] + " " 
        + values_per_line[1] + " " + values_per_line[2] + " " 
        + values_per_line[3]); 
      line = reader.readLine(); 
     } 
     reader.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

andernfalls, wenn sie alle in einer Linie liniert sind, die keinen Sinn ergeben würde, dann modifiziere dieses Beispiel.

Sam Slugger,h,h,o,s,w,w,h,w,o,o,o,h,s| John Slugger,h,h,o,s,w,w,h,w,o,o,o,h,s 

BufferedReader reader; 
    try { 
     reader = new BufferedReader(new FileReader(new File("file.txt"))); 
     String line = ""; 
     while ((line = reader.readLine()) != null) { 
      // token identifier is a space 
      String[] data = line.trim().split("|"); 
      for (int i = 0; i < data.length; i++) 
       System.out.println("Name:" + data[0].split(",")[0] + " " 
         + data[1].split(",")[1] + " " 
         + data[2].split(",")[2] + " " 
         + data[3].split(",")[3]); 
      line = reader.readLine(); 
     } 
     reader.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }