我正在设计一个程序,根据该数据的标签将存储在文本文件中的数据拆分为两个单独的文件。
以下是该数据的小版本。
0,1,2,normal.
5,5,5,strange.
2,1,3,normal.
我使用一个类来存储每一行作为样本。该类解析该行以将最后一个值存储为标签。我将每一行封装为一个对象,因为我打算稍后添加功能。
以下是Sample
类
import java.util.Scanner;
public class Sample {
String[]str_vals = new String[3];
String label;
Sample(Scanner line) {
for (int i=0; i<3; i++) {
str_vals[i] = line.next();
}
label = line.next();
}
String getValsForCSV() {
StringBuilder retval = new StringBuilder();
for (int i=0; i<3; i++) {
retval.append(str_vals[i]).append(",");
}
retval.append(label).append(".");
return retval+"";
}
String getLabel() {
return label;
}
}
以下是相关代码。我的Separator
课程。
import java.io.*;
import java.util.Scanner;
public class Separator {
public static final String DATAFILE = "src/etc/test.txt";
public static void main(String[] args) throws FileNotFoundException {
runData();
}
public static void runData() throws FileNotFoundException {
try (Scanner in = new Scanner(new File(DATAFILE))) {
// kddcup file uses '.\n' at end of each line
// setting this as delimiter which will consume the period
in.useDelimiter("[.]\r\n|[.]\n|\n");
Sample curr;
while(in.hasNext()) {
// line will hold all fields for a single sample
Scanner line = new Scanner(in.next());
line.useDelimiter(", *");
curr = new Sample(line);
try (
PrintWriter positive = new PrintWriter(new File(DATAFILE+"-pos"));
PrintWriter negative = new PrintWriter(new File(DATAFILE+"-neg"));
) {
if (curr.getLabel().equals("normal")) {
positive.println("GOOD");
} else {
negative.println("BAD");
}
}
}
}
}
}
我遇到的这个问题是代码只会将最后看见的Sample
保存到各自的文件中。因此,对于上述数据,test.txt-neg
将为空,test.txt-pos
将有一行GOOD
;它没有预期的两个GOOD
。
如果我将test.txt
数据修改为仅包含前两行,则文件状态将被反转(即test.txt-neg
具有BAD
且test.txt-pos
为空。有人可以向我解释发生了什么,以及如何解决这个错误?
答案 0 :(得分:0)
因为评论中指出了错误。我想赞扬KevinO和Elliott Frisch的解决方案。
如上所述,我每次都要创建一个新的PrintWriter
并在其中创建PrintWriter
覆盖文件的默认模式。因此,它始终基于单个样本保存两个文件。
要更正此错误,我已将PrintWriter
的实例化提取到Scanner
对象的try-with-resource块中
import java.io.*;
import java.util.Scanner;
public class Separator {
public static final String DATAFILE = "src/etc/test.txt";
public static void main(String[] args) throws FileNotFoundException {
runData();
}
public static void runData() throws FileNotFoundException {
try (
Scanner in = new Scanner(new File(DATAFILE));
PrintWriter positive = new PrintWriter(new File(DATAFILE+"-pos"));
PrintWriter negative = new PrintWriter(new File(DATAFILE+"-neg"));
) {
// kddcup file uses '.\n' at end of each line
// setting this as delimiter which will consume the period
in.useDelimiter("[.]\r\n|[.]\n|\n");
Sample curr;
while(in.hasNext()) {
// line will hold all fields for a single sample
Scanner line = new Scanner(in.next());
line.useDelimiter(", *");
curr = new Sample(line);
if (curr.getLabel().equals("normal")) {
positive.println("GOOD");
} else {
negative.println("BAD");
}
}
}
}
}