2015-04-24 5 views
5

Мне нужно написать программу, которая будет анализировать информацию о бейсболисте и хиты, выйти, пройти, ect из txt-файла. Например, txt-файл может выглядеть примерно так: 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 file

Я знаю, как разбирать файл и может заставить этот код работать безупречно , Единственная проблема, с которой я столкнулась, заключается в том, что мы должны печатать только имя для каждого игрока и 3 или их пьесы. Например: Сэм Слаггер удар, удар, из Джилл Дженкс из, из, жертву летать Уилла Джонса, из, ходить

Я не уверен, как ограничить это и каждый раз, когда я пытаюсь отрезать ее в 3 Я всегда получаю первого человека, который отлично работает, но он прерывает цикл и ничего не делает для всех остальных игроков.

Это то, что я до сих пор:

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

     } 
    } 
} 

Это печатает: Сэм Слаггер, ч, ч, о, но другие игроки аннулирована из. Мне нужна помощь и для печати других.

+0

У вас есть контроль над форматом файлов? –

+0

К сожалению нет. Предполагается, что файл должен быть бесконечным. В нем может быть столько игроков, сколько в файле. – cweidner55

+0

Вам нужно сбросить свою переменную 'count', посмотрите мой ответ ниже. – Phoenix

ответ

0

Первая проблема

Изменение while(fileScan.hasNext())) в while(fileScan.hasNextLine()). Не проблема, но при использовании сканера вы обычно ставите sc.* сразу после sc.has*.

Вторая проблема

Удалите строку fileScan.useDelimiter(","). Эта строка не делает ничего в этом случае, но заменяет разделитель по умолчанию, поэтому сканер больше не разбивается на пробелы. Что не имеет значения при использовании Scanner.nextLine, но может иметь некоторые неприятные побочные эффекты позже.

Третья проблема

Изменить эту строку for(urlScan.hasNext(); count<4; count++) в while(urlScan.hasNext()). Честно говоря, я удивлен, что строка даже скомпилирована, и если она сделала это, то только первые 4 из сканера.

Если вы хотите ограничить количество обработанного для каждой строки вы можете заменить его

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

Это ограничит количество прочитанного limit в то же время обработки строк, которые имеют меньше данных, чем предел.

Убедитесь, что каждый из ваших наборов данных отделен линией, иначе выход может не иметь особого смысла.

0

Вам нужно сбросить count автомобиля в то время цикла:

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

Вы не должны иметь несколько сканеров на это - если формат, размещенный в вашем вопросе вы можете использовать регулярные выражения, чтобы сделать это.

Это демонстрирует регулярное выражение в соответствии с проигрывателем и использование в качестве разделителя для сканера. Я подал сканеру в свой пример строку, но метод тот же, независимо от источника.

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

Выход:

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

Вызов Scanner.delimiter() задает разделитель, используемый для извлечения лексем. Регулярное выражение (?<=,\\w)\\s:

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

Каких разграничивают игрок от пространства между их записями без согласования ничего, кроме этого пространства, и не совпадают пространство между именами.

Регулярное выражение, используемое для извлечения до 3 игр на игрока \\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

Спасибо, ребята, эти ответы действительно помогли тонну, и теперь я получил ее работу. – cweidner55

+0

@ cweidner55 если этот ответ решает вашу проблему, нажмите зеленую проверку. – Voldemort

1

Здесь, попробуйте это с помощью FileReader Предполагая, что ваш формат содержимого файла как этот

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 

с каждый игрок в своей собственной линии, то это может сработать для вас

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

в противном случае, если они выровнены все как одна строка, которая не имеет смысла, тогда измените этот образец.

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