Как я могу использовать метод trim (), чтобы сделать эту работу? Мне нужно прочитать текстовый файл, игнорируя пустую строку и строки, которые начинаются с "//" - PullRequest
0 голосов
/ 24 февраля 2020
public void readToooooolData(String fileName) throws FileNotFoundException
    {
         File dataFile = new File(fileName);
        Scanner scanner = new Scanner(dataFile);
        scanner.useDelimiter("( *, *)|(\\s*,\\s*)|(\r\n)|(\n)");

         while(scanner.hasNextLine()) {
             String line = scanner.nextLine();
        if(!line.startsWith("//") || !(scanner.nextLine().startsWith(" ") )) {
          String toolName = scanner.next();
         String itemCode = scanner.next();
         int timesBorrowed = scanner.nextInt();
         boolean onLoan = scanner.nextBoolean();
         int cost = scanner.nextInt();
         int weight = scanner.nextInt();
         storeTool( new Tool(toolName, itemCode, timesBorrowed, onLoan, cost, weight) );
         scanner.nextLine();
        } 
        scanner.close();

    }

}

текстовый файл:

// this is a comment, any lines that start with //
// (and blank lines) should be ignored

// data is toolName, toolCode, timesBorrowed, onLoan, cost, weight  
Makita BHP452RFWX,RD2001, 12 ,false,14995,1800  
Flex Impact Screwdriver FIS439,RD2834,14,true,13499,1200  
DeWalt D23650-GB Circular Saw, RD6582,54,true,14997,5400  
Milwaukee DD2-160XE Diamond Core Drill,RD4734,50,false,38894,9000  
Bosch GSR10.8-Li Drill Driver,RD3021,25, true,9995,820  
 Bosch GSB19-2REA Percussion Drill,RD8654,85,false,19999,4567  
Flex Impact Screwdriver FIS439, RD2835,14,false,13499,1200  
DeWalt DW936 Circular Saw,RD4352,18,false,19999,3300  
Sparky FK652 Wall Chaser,RD7625,15,false,29994,8400  

1 Ответ

3 голосов
/ 24 февраля 2020

Есть некоторые проблемы с вашим кодом.

  • Лучше использовать попробовать с ресурсами , чтобы открыть Сканер

  • Некоторые из указанных вами разделителей дублируются, а некоторые не нужны. Пробел входит в \s, поэтому (\s*,\s*) является дубликатом ( *, *), и (\r\n)|(\n) не требуется.

  • Вы читаете строку из файла и проверяете, для того, чтобы быть комментарием или пустой строкой - хорошо. Затем вам нужно извлечь токены из уже прочитанной строки, но вы не можете использовать scanner.next() для этого, потому что он вернет вам следующий токен после строки, которую вы только что прочитали. То, что на самом деле делает ваш код, пытается проанализировать информацию в строке после строки без комментариев / не пустой.

  • Существует также другая scanner.nextLine() в конце l oop, поэтому вы пропускаете еще одну строку из файла.

public void readToooooolData(String fileName) throws FileNotFoundException {
    File dataFile = new File(fileName);
    try (Scanner scanner = new Scanner(dataFile)) {
      while (scanner.hasNextLine()) {
        String line = scanner.nextLine().trim();
        if (line.startsWith("//") || line.isEmpty()) {
          continue;
        }
        String tokens[] = line.split("\\s*,\\s*");
        if (tokens.length != 6) {
          throw new RuntimeException("Wrong data file format");
        }
        String toolName = tokens[0];
        String itemCode = tokens[1];
        int timesBorrowed = Integer.parseInt(tokens[2]);
        boolean onLoan = Boolean.parseBoolean(tokens[3]);
        int cost = Integer.parseInt(tokens[4]);
        int weight = Integer.parseInt(tokens[5]);
        storeTool( new Tool(toolName, itemCode, timesBorrowed, onLoan, cost, weight) );
      }
    }
  }
...