Search code examples
javareadfile

Read File and extract to different output


I have the following data. What I'm trying to do is to separate every reading into different outputs, but it does not work. It only show 'null'. What i expected to work are:

Output: C.txt
1 1000 1000
2 2000 2000

Output: B.txt
1 2 90.000 2
2 3 180.000 2

Output: D.txt
1 2 100.1 0.038
2 3 200.1 0.038

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


Solution

  • tokenizer.nextToken() will throw NoSuchElementException when there are no more tokens in the tokenizer's string.

    Your sample input, if provided, will throw "NoSuchElementException" because Data in "Input.txt" for "C" is wrong. In your program, you are calling "nextToken" five times, whereas data for "C" contains only 4 values(C;1;1000;1000).

    Below, is improved "Input" data.

    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
    

    Also, you need to improve your while loop to read empty line. Currently, it will throw Error. Consider below while loop:

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