同时读取两个文本文件中的每一行- Java

7

我有两个不同语言的文本文件,它们按行对齐。即文本文件1中的第一行应该等于文本文件2中的第一行,以此类推。

有没有一种方法可以同时逐行读取这两个文件?

下面是文件的样本,想象每个文件的行数大约为1000000。

文本文件1:

This is a the first line in English
This is a the 2nd line in English
This is a the third line in English

文本文件2:

C'est la première ligne en Français
C'est la deuxième ligne en Français
C'est la troisième ligne en Français

期望的输出
This is a the first line in English\tC'est la première ligne en Français
This is a the 2nd line in English\tC'est la deuxième ligne en Français
This is a the third line in English\tC'est la troisième ligne en Français

目前,我可以使用这个方法,但将几百万行数据保存在内存中会使我的计算机几乎崩溃。

String english = "/home/path-to-file/english";
String french = "/home/path-to-file/french";
BufferedReader enBr = new BufferedReader(new FileReader(english));
BufferedReader frBr = new BufferedReader(new FileReader(french));

ArrayList<String> enFile = new ArrayList<String>();
while ((line = enBr.readLine()) != null) {
    enFile.add(line);
}

int index = 0;
while ((line = frBr.readLine()) != null) {
    String enSentence = enFile.get(index);
    System.out.println(line + "\t" + enSentence);
    index++;
}

1
为什么不将这两个读取操作合并到一个while循环中呢? - Ewald
1
我认为,假设有两个100万行的文件,它们在所有100万行上完全对齐的概率非常小。除非你能解决这个问题,否则你的代码将会很脆弱。 - Jeff Watkins
你只需要打印这些行还是也需要存储它们? - Logan
2
也许有一天它会对你有用,但是如果你正在使用Unix系统,请考虑使用这个命令:paste -d '\t' english french > englishandfrench - Zakaria
我必须将它们存储起来,并且很可能在读取每个句子后立即将其索引到一个文本文件中。 - alvas
有多少种不同的方法可以读取文本文件?我已经使用了Scanner和new BufferedReader(new FileReader(myFile)),但我相信还有其他不同的方法。我发现即使使用Scanner对象,也至少有三种不同的方法。我会把它们发布出来,但我现在正在工作,无法访问我的计算机。 - Doug Hauf
2个回答

10
将对两个读取器的nextLine调用放在同一个循环中:
String english = "/home/path-to-file/english";
String french = "/home/path-to-file/french";
BufferedReader enBr = new BufferedReader(new FileReader(english));
BufferedReader frBr = new BufferedReader(new FileReader(french));

while (true) {
    String partOne = enBr.readLine();
    String partTwo = frBr.readLine();

    if (partOne == null || partTwo == null)
        break;

    System.out.println(partOne + "\t" + partTwo);
}

谢谢,现在它可以工作了。我认为index在计算句子数量方面会很有用。但是我使用了if(...)continue;而不是break; - alvas

2
这是我的做法:
List<String> strings = new ArrayList<String>();
BufferedReader enBr = ...
BufferedReader frBr = ...

String english = "";
String french = "";
while (((english = enBr.readline()) != null) && ((french = frBr.readline) != null))
{
    strings.add(english + "\t" + french);
}

但是,如果法语文件包含更多行,则这些行不会成为结果的一部分。 - Zakaria
@Zakaria:如果这是真的,那么我认为这个陈述不成立:“我有两个不同语言的文本文件,并且它们按行对齐。也就是说,textfile1中的第一行应该等于textfile2中的第一行,依此类推。” - npinti
这种方法也可以工作,但是另一种方法更直观,不需要全局的 String englishString french。如果我必须比较前一个句子是否相同,那么这个解决方案将更加合适。 - alvas
@npinti:在我看来,“应该”的部分必须通过处理非一致文件(例如:不同行数)来实现 :) - Zakaria
如果有多个文件怎么办? - plzdontkillme
@plzdontkillme:应该有两个文件。 - npinti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接