2015-04-24 23 views
5

Devo scrivere un programma che analizzerà le informazioni sui giocatori di baseball e li colpirà, uscirà, camminerà, eccetto da un file txt. Ad esempio il file txt potrebbe essere qualcosa del genere: Sam Slugger, h, h, o, s, w, w, h, o, o, o, h, s Jill Jenks, o, o, s, h, h, o, o Will Jones, o, o, w, h, o, o, o, w, o,Analisi del file txt

So come analizzare il file e posso ottenere che il codice funzioni perfettamente . L'unico problema che sto avendo è che dovremmo stampare solo il nome per ciascun giocatore e 3 o le loro giocate. Per esempio: Sam Slugger ha colpito, ha colpito, fuori Jill Jenks fuori, fuori, sacrificare volare Will Jones fuori, fuori, camminare

Non sono sicuro di come limitare questo e ogni volta che cerco di tagliarlo fuori a 3 Riesco sempre a far funzionare bene la prima persona ma rompe il loop e non fa nulla per tutti gli altri giocatori.

Questo è quello che ho finora:

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

     } 
    } 
} 

Questo stampa: Sam Slugger, h, h, o, ma poi gli altri giocatori vengono annullate fuori. Ho bisogno di aiuto per far stampare anche gli altri.

+0

Avete il controllo del formato del file? –

+0

Purtroppo no. Il file dovrebbe avere il potenziale per essere infinito. Potrebbero esserci tanti giocatori quanti ne contiene il file. – cweidner55

+0

Devi resettare la variabile 'count', guarda la mia risposta qui sotto. – Phoenix

risposta

0

primo problema

Change while(fileScan.hasNext())) a while(fileScan.hasNextLine()). Non è un problema di rottura, ma quando si utilizza lo scanner di solito si inserisce sc.* subito dopo un sc.has*.

secondo problema

Rimuovere la riga fileScan.useDelimiter(","). Questa linea non fa nulla in questo caso ma sostituisce il delimitatore predefinito in modo che lo scanner non si divida più sugli spazi bianchi. Che non importa quando si utilizza Scanner.nextLine, ma può avere alcuni effetti collaterali brutto in seguito.

terzo problema

Modificare questa linea for(urlScan.hasNext(); count<4; count++) a while(urlScan.hasNext()). Onestamente sono sorpreso che la riga sia stata compilata e, in caso affermativo, legge solo i primi 4 dallo scanner.

Se si vuole limitare la quantità lavorate per ogni linea è possibile sostituirlo con

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

Questo limiterà la quantità di leggere a limit mentre ancora gestire le linee che hanno meno dati rispetto al limite.

Assicurarsi che ognuno dei propri set di dati sia separato da una riga altrimenti l'output potrebbe non avere molto senso.

0

È necessario reimpostare la vostra auto count nel ciclo while:

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

Non si dovrebbe avere più scanner su questo - assumendo il formato in cui hai postato la tua domanda è possibile utilizzare le espressioni regolari per fare questo.

Ciò dimostra un'espressione regolare per abbinare un giocatore e utilizzare come delimitatore per lo scanner. Ho alimentato lo scanner nel mio esempio una stringa, ma la tecnica è la stessa indipendentemente dalla fonte.

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

uscita:

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

La chiamata al Scanner.delimiter() imposta il delimitatore da utilizzare per il recupero gettoni. La regex (?<=,\\w)\\s:

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

che delimita i giocatori dallo spazio tra le loro voci, senza corrispondenza tutt'altro che quello spazio, e non riesce a corrispondere lo spazio tra i nomi.

L'espressione regolare utilizzata per estrarre fino a 3 giochi per giocatore è \\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

Grazie ragazzi, queste risposte mi hanno davvero aiutato e ora ho funzionato. – cweidner55

+0

@ cweidner55 se questa risposta ha risolto il problema, fare clic sul segno di spunta verde. – Voldemort

1

Ecco, provate questo utilizzando FileReader Assumendo che il formato del contenuto del file è come questo

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 

con ogni giocatore nella propria linea quindi questo può funzionare per voi

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

altrimenti se sono allineati tutti come una riga che non avrebbe senso modificare questo esempio.

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