我的TAB分隔输入文件 100万行,它看起来像这样:
id name artist_name genre notoriete_fr notoriete_us notoriete_uk notoriete_it notoriete_sp notoriete_no notoriete_de notoriete_wd
1 10ème bougie 113 rap 0 -5 -5 -5 -5 -5 -5 -5
2 I'm not in love 10cc pop 1 1 1 1 1 1 1 1
5 Generation Black Rebel Motorcycle Club rock 0 0 0 0 0 0 0 0
我编写了一个文件格式转换,输出文件如下所示:
id:ID;genre;notoriete_fr:int;notoriete_us:int;notoriete_uk:int;notoriete_sp:int;notoriete_de:int;notoriete_it:int;notoriete_no:int;notoriete_wd:int;:LABEL
t1;rap;0;-5;-5;-5;-5;-5;-5;-5;Track
t5;rock;0;0;0;0;0;0;0;0;Track
我有两个问题:
t2
缺少行这是我的代码,提前谢谢!
注意:我还将缓冲区大小添加到new BufferedWriter()/Reader()
,没有任何影响。
public static void main(String[] args) throws Exception {
BufferedReader br = null;
BufferedWriter bw = null;
try{
// prepare input file
File inFile = new File(inputFile);
br = new BufferedReader(new FileReader(inFile));
String line = "";
String cvsSplitBy = "\t";
// prepare output file
File outFile = new File(outputFile);
bw = new BufferedWriter(new FileWriter(outFile));
// Write header
bw.write("id:ID;genre;notoriete_fr:int;notoriete_us:int;notoriete_uk:int;notoriete_sp:int;notoriete_de:int;notoriete_it:int;notoriete_no:int;notoriete_wd:int;:LABEL\n");
while ((line = br.readLine()) != null) {
// READING
line = br.readLine();
String[] features = line.split(cvsSplitBy);
// WRITING
bw.write("t"+features[0]+";"+features[3]+";"+features[4]+";"+features[5]+";"+features[6]+";"+features[7]+";"+features[8]+";"+features[9]+";"+features[10]+";"+features[11]+";Track\n");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
答案 0 :(得分:2)
输出文件只有8.3%的输入文件行
就你的代码而言,它应该是50%的行应该丢失。您的大小不同,因为父文件中的数据格式与您正在创建的文件格式不同。我之所以这样说,是因为您的代码会跳过备用行。
让我解释一下,在你的while循环条件下,你正在使用line = br.readLine()
读取第1行。现在在while循环的第一行,你再次使用line = br.readLine()
这将读取第2行。 文件。您正在使用它来写入数据,因此第2行数据被写入。现在在第二个循环中,在while循环条件下,您正在读取文件的第3行,在while循环的第一行中,您正在读取文件的第4行,并且此行被写入。所以你看到你获得了50%的输出。
现在你认为你理解为什么你在输出文件中得到较少的行。所以简单的解决方案是摆脱while循环的第一行,并让条件保持不变。
答案 1 :(得分:1)
此行为可归因于代码中的以下两行。
while ((line = br.readLine()) != null) {
// READING
line = br.readLine();
你在检查期间从文件中读取两行,在行= br.readline()期间读取一行,导致跳过的行。你应该只在while循环检查时阅读。
while ((line = br.readLine()) != null) {
// use line variable value for printing