Прочитайте файл и извлеките в другой вывод - PullRequest
0 голосов
/ 28 октября 2018

У меня есть следующие данные.Я пытаюсь разделить каждое чтение на разные выводы, но это не работает.Это только показывает «ноль».То, что я ожидал работать:

Вывод: C.txt
1 1000 1000
2 2000 2000

Вывод: B.txt
1 2 90.000 2
2 3 180.000 2

Выход: D.txt
1 2 100,1 0,038
2 3 200,1 0,038

Данные в Input.txt:
C; 1; 1000; 1000
C; 2; 2000; 2000

B; 1; 2; 90,00; 2
B; 2; 3; 180,00; 2

D; 1; 2; 100,1; 0,038
D; 2; 3; 200,1; 0,038

import java.io.*;
import java.util.StringTokenizer;

public class ReadFile {

  public static void main(String[] args) {
    BufferedReader input = null; //read
    PrintWriter outC = null; //write output
    PrintWriter outB = null;
    PrintWriter outD = null;
    try {
      input = new BufferedReader(new FileReader("C:\\Users\\PC\\Desktop\\FYP\\Input.txt"));
      outC = new PrintWriter(new BufferedWriter(new FileWriter("C:\\Users\\PC\\Desktop\\FYP_Test\\C.txt")));
      outB = new PrintWriter(new BufferedWriter(new FileWriter("C:\\Users\\PC\\Desktop\\FYP_Test\\B.txt")));
      outD = new PrintWriter(new BufferedWriter(new FileWriter("C:\\Users\\PC\\Desktop\\FYP_Test\\D.txt")));

      String inputData = null;
      int C = 0;
      int B = 0;
      int D = 0;
      while ((inputData = input.readLine()) != null) {
        StringTokenizer tokenizer = new StringTokenizer(inputData, ";");
        String id = tokenizer.nextToken();
        String StnFrom = tokenizer.nextToken();
        String NorthingTo = tokenizer.nextToken();
        String EastingDistBrg = tokenizer.nextToken();
        String StdError = tokenizer.nextToken();

        if (id.equalsIgnoreCase("C")) {
          C++;
          outC.println(StnFrom + " " + NorthingTo + " " + EastingDistBrg);
        } else if (id.equalsIgnoreCase("B")) {
          B++;
          outB.println(StnFrom + " " + NorthingTo + " " + EastingDistBrg + " " + StdError);
        } else if (id.equalsIgnoreCase("D")) {
          D++;
          outB.println(StnFrom + " " + NorthingTo + " " + EastingDistBrg + " " + StdError);
        }
      }
      input.close();
      outC.close();
      outB.close();
      outD.close();
    } catch (FileNotFoundException fe) {
      System.out.println(fe.getMessage());
    } catch (IOException iox) {
      System.out.println(iox.getMessage());
    } catch (Exception e) {
      System.out.println(e.getMessage());
    }
  }
}

1 Ответ

0 голосов
/ 28 октября 2018

tokenizer.nextToken() сгенерирует NoSuchElementException, когда в строке токенизатора больше не будет токенов.

Ваш пример ввода, если он предоставлен, сгенерирует «NoSuchElementException», поскольку данные в «Input.txt» для «С "не так.В вашей программе вы вызываете «nextToken» пять раз, тогда как данные для «C» содержат только 4 значения (C; 1; 1000; 1000).

Ниже улучшены «Входные» данные.

C;1;1000;1000;1
C;2;2000;2000;1

B;1;2;90.00;2
B;2;3;180.00;2

D;1;2;100.1;0.038
D;2;3;200.1;0.038

Кроме того, вам нужно улучшить цикл while для чтения пустой строки.В настоящее время будет выдавать ошибку.Рассмотрим ниже цикл while:

while ((inputData = input.readLine()) != null) {
        if(inputData.length() != 0) {
          StringTokenizer tokenizer = new StringTokenizer(inputData, ";");
          String id = tokenizer.nextToken();
          String StnFrom = tokenizer.nextToken();
          String NorthingTo = tokenizer.nextToken();
          String EastingDistBrg = tokenizer.nextToken();
          String StdError = tokenizer.nextToken();

          if (id.equalsIgnoreCase("C")) {
            C++;
            outC.println(StnFrom + " " + NorthingTo + " " + EastingDistBrg);
          } else if (id.equalsIgnoreCase("B")) {
            B++;
            outB.println(StnFrom + " " + NorthingTo + " " + EastingDistBrg + " " + StdError);
          } else if (id.equalsIgnoreCase("D")) {
            D++;
            outD.println(StnFrom + " " + NorthingTo + " " + EastingDistBrg + " " + StdError);
          }
        }
      }
...