2015-04-24 19 views
5

Muszę napisać program, który będzie parsować informacje o graczach baseballowych i trafienia, wyjścia, chodzenia, ect z pliku txt. Na przykład plik txt może wyglądać mniej więcej tak: Sam Slugger, h, h, o, s, w, w, h, w, o, o, o, h, s Jill Jenks, o, o, s, h, h, o, o Czy Jones, o, o, w, h, o, o, o, o, o, oParsowanie pliku txt

Wiem, jak przeanalizować plik i można uzyskać ten kod działa idealnie . Jedyny problem jaki mam to to, że powinniśmy drukować tylko nazwę dla każdego gracza i 3 lub ich sztuk. Na przykład: Sam Slugger uderzyć, uderzyć, z Jill Jenks na zewnątrz, na zewnątrz, sacrifice fly Will Jones na zewnątrz, na zewnątrz, chodzić

nie jestem pewien, jak ograniczyć to i za każdym razem staram się odetnij ją na 3 Zawsze pierwsza osoba działa dobrze, ale przerywa pętlę i nie robi nic dla wszystkich innych graczy.

To, co mam tak daleko:

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(); 

     } 
    } 
} 

ten wypisuje: Sam baseballowy, H, H, O, ale potem pozostali gracze są unieważnione na zewnątrz. Potrzebuję pomocy, aby inni drukowali również.

+0

Czy masz kontrolę nad formatem pliku? –

+0

Niestety nie. Plik ma być potencjalnie nieskończony. Może w nim być tylu graczy, ilu ma plik. – cweidner55

+0

Musisz zresetować zmienną 'count', spójrz na moją odpowiedź poniżej. – Phoenix

Odpowiedz

0

Pierwszy problem

Zmień while(fileScan.hasNext())) do while(fileScan.hasNextLine()). Nie jest to problem łamiący, ale podczas korzystania ze skanera zwykle umieszczasz sc.* tuż po sc.has*.

Drugi problem

Usuń linię fileScan.useDelimiter(","). Linia ta nie robi w tym przypadku nic, ale zastępuje domyślny separator, aby skaner nie dzielił się już na białe znaki. To nie ma znaczenia, gdy używasz Scanner.nextLine, ale może później wywołać nieprzyjemne efekty uboczne.

Trzeci problem

Zmiana ta linia for(urlScan.hasNext(); count<4; count++) do while(urlScan.hasNext()). Szczerze mówiąc, jestem zaskoczony, że linia została skompilowana, a jeśli tak, to tylko odczytała pierwsze 4 ze skanera.

Jeśli chcesz ograniczyć ilość przetwarzanych dla każdej linii można zastąpić go

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

ograniczy ilość odczytu do limit jednocześnie obsługę linii, które mają mniej danych niż limit.

Upewnij się, że każdy zestaw danych jest oddzielony linią, w przeciwnym razie dane wyjściowe mogą nie mieć większego sensu.

0

Trzeba zresetować swój samochód count w pętli while:

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

Nie powinno mieć wiele skanerów na to - przy założeniu, że format, który pisał w swoim pytaniu można użyć wyrażeń regularnych, aby to zrobić.

To demonstruje wyrażenie regularne pasujące do odtwarzacza i używane jako ogranicznik dla skanera. Nakarmiłem skaner w moim przykładzie ciągiem, ale technika jest taka sama niezależnie od źródła.

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); 

wyjściowa:

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

Wezwanie do Scanner.delimiter() ustawia separator do korzystania za zdobycie tokenów. Regex (?<=,\\w)\\s:

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

która ogranicza graczy przez przestrzeń między ich wpisów bez dopasowania niczego oprócz tej przestrzeni, a nie pasuje do przestrzeni między nazwami.

Wyrażenie regularne używane do ekstrakcji do 3 sztuk na odtwarzaczu jest \\w+\\s\\w+(?:,\\w){1,3}:

\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

Dzięki chłopaki, te odpowiedzi naprawdę pomogły tonę i teraz mam to działa. – cweidner55

+0

@ cweidner55, jeśli ta odpowiedź rozwiązała Twój problem, kliknij zielony czek. – Voldemort

1

Tutaj spróbować tego przy użyciu FileReader Zakładając, że treść pliku jest jak ten

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 

z każdy gracz we własnej linii może to dla ciebie zrobić

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(); 
    } 

w przeciwnym razie, jeśli są one wyłożone w jednej linii, co nie ma sensu, zmodyfikuj tę próbkę.

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(); 
    }