读取文件并提取到不同的输出
Read File and extract to different output
我有以下数据。我想做的是将每个读数分成不同的输出,但它不起作用。它只显示 'null'。我期望的工作是:
输出:
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());
}
}
}
tokenizer.nextToken()
将在标记器的字符串中没有更多标记时抛出 NoSuchElementException
。
您的示例输入(如果提供)将抛出 "NoSuchElementException",因为 "Input.txt" 中 "C" 的数据是错误的。在您的程序中,您调用了 "nextToken" 五次,而 "C" 的数据仅包含 4 个值(C;1;1000;1000).
下面是改进的"Input"数据。
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);
}
}
}
我有以下数据。我想做的是将每个读数分成不同的输出,但它不起作用。它只显示 'null'。我期望的工作是:
输出:
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());
}
}
}
tokenizer.nextToken()
将在标记器的字符串中没有更多标记时抛出 NoSuchElementException
。
您的示例输入(如果提供)将抛出 "NoSuchElementException",因为 "Input.txt" 中 "C" 的数据是错误的。在您的程序中,您调用了 "nextToken" 五次,而 "C" 的数据仅包含 4 个值(C;1;1000;1000).
下面是改进的"Input"数据。
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);
}
}
}