Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从两个大文件逐行比较数据_Java - Fatal编程技术网

Java 从两个大文件逐行比较数据

Java 从两个大文件逐行比较数据,java,Java,我需要分析两个大数据文件之间的差异,这两个文件应该具有相同的结构。每个文件都有几GB的大小,大约有3000万行或文本数据。数据文件太大了,以至于我不太愿意将每个文件加载到自己的数组中,因为按顺序遍历行可能更容易。每一行都有以下结构: topicIdx, recordIdx, other fields... topicIdx和recordIdx是顺序的,从零开始,每次迭代递增+1,因此很容易在文件中找到它们。(无需四处搜索;只需按顺序向前递增) 我需要做一些事情,比如: for each l

我需要分析两个大数据文件之间的差异,这两个文件应该具有相同的结构。每个文件都有几GB的大小,大约有3000万行或文本数据。数据文件太大了,以至于我不太愿意将每个文件加载到自己的数组中,因为按顺序遍历行可能更容易。每一行都有以下结构:

topicIdx, recordIdx, other fields...  
topicIdx和recordIdx是顺序的,从零开始,每次迭代递增+1,因此很容易在文件中找到它们。(无需四处搜索;只需按顺序向前递增)

我需要做一些事情,比如:

for each line in fileA  
    store line in String itemsA  
       get topicIdx and recordIdx  
           find line in fileB with same topicIdx and recordIdx  
               if exists  
                   store this line in string itemsB  
                       for each item in itemsA  
                           compare value with same index in itemsB  
                               if these two items are not virtually equal  
                                   //do something  
                else  
                    //do something else  
我使用FileReader和BufferedReader编写了以下代码,但是这些API似乎没有提供我需要的功能。有人能告诉我如何修复下面的代码,使它实现我的愿望吗

void checkData(){  
    FileReader FileReaderA;  
    FileReader FileReaderB;  
    int topicIdx = 0;  
    int recordIdx = 0;  
    try {  
        int numLines = 0;
        FileReaderA = new FileReader("B:\\mypath\\fileA.txt");  
        FileReaderB = new FileReader("B:\\mypath\\fileB.txt");  
        BufferedReader readerA = new BufferedReader(FileReaderA);  
        BufferedReader readerB = new BufferedReader(FileReaderB);
        String lineA = null;
        while ((lineA = readerA.readLine()) != null) {
            if (lineA != null && !lineA.isEmpty()) {
                List<String> itemsA = Arrays.asList(lineA.split("\\s*,\\s*"));
                topicIdx = Integer.parseInt(itemsA.get(0));
                recordIdx = Integer.parseInt(itemsA.get(1));
                String lineB = null;
                //lineB = readerB.readLine();//i know this syntax is wrong
                setB = rows from FileReaderB where itemsB.get(0).equals(itemsA.get(0));
                for each lineB in setB{
                    List<String> itemsB = Arrays.asList(lineB.split("\\s*,\\s*"));
                    for(int m = 0;m<itemsB.size();m++){}
                    for(int j=0;j<itemsA.size();j++){  
                    double myDblA = Double.parseDouble(itemsA.get(j));  
                    double myDblB = Double.parseDouble(itemsB.get(j));  
                    if(Math.abs(myDblA-myDblB)>0.0001){  
                        //do something  
                    }  
                 }  
            }  
        }  
        readerA.close();  
    }   catch (IOException e) {e.printStackTrace();}  
}  
void checkData(){
文件阅读器;
文件阅读器文件阅读器;
int-topicIdx=0;
int-recordIdx=0;
试试{
int numLines=0;
FileReaderA=newfilereader(“B:\\mypath\\fileA.txt”);
FileReaderB=newfilereader(“B:\\mypath\\fileB.txt”);
BufferedReader readerA=新的BufferedReader(FileReaderA);
BufferedReader readerB=新的BufferedReader(FileReaderB);
字符串lineA=null;
而((lineA=readerA.readLine())!=null){
如果(lineA!=null&&!lineA.isEmpty()){
List itemsA=Arrays.asList(lineA.split(“\\s*,\\s*”);
topicIdx=Integer.parseInt(itemsA.get(0));
recordIdx=Integer.parseInt(itemsA.get(1));
字符串lineB=null;
//lineB=readerB.readLine();//我知道这个语法是错误的
setB=FileReaderB中的行,其中itemsB.get(0).equals(itemsA.get(0));
对于收进B中的每一行B{
List itemsB=Arrays.asList(lineB.split(“\\s*,\\s*”);

对于(int m=0;m如果您在Java中真的需要它,为什么不使用它?它实现了一个众所周知的diff算法。

如果您在Java中真的需要它,为什么不使用它?它实现了一个众所周知的diff算法。

考虑。让其他人做重担。

考虑。让其他人做重担。

您需要这两个文件通过搜索键(recordIdx和topicIdx)进行合并,因此可以执行类似这样的合并操作

open file 1
open file 2
read lineA from file1
read lineB from file2
while (there is lineA and lineB) 
    if (key lineB < key lineA) 
        read lineB from file 2
        continue loop
    if (key lineB > key lineA)
        read lineA from file 1
        continue
    // at this point, you have lineA and lineB with matching keys
    process your data
    read lineB from file 2
打开文件1
打开文件2
从文件1中读取lineA
从文件2中读取lineB
while(有lineA和lineB)
if(键线B<键线A)
从文件2中读取lineB
继续循环
如果(关键线B>关键线A)
从文件1中读取lineA
持续
//此时,有了具有匹配关键点的lineA和lineB
处理数据
从文件2中读取lineB

请注意,内存中只有两条记录。

您需要两个按搜索键排序的文件(recordIdx和topicIdx),因此您可以执行类似这样的合并操作

open file 1
open file 2
read lineA from file1
read lineB from file2
while (there is lineA and lineB) 
    if (key lineB < key lineA) 
        read lineB from file 2
        continue loop
    if (key lineB > key lineA)
        read lineA from file 1
        continue
    // at this point, you have lineA and lineB with matching keys
    process your data
    read lineB from file 2
打开文件1
打开文件2
从文件1中读取lineA
从文件2中读取lineB
while(有lineA和lineB)
if(键线B<键线A)
从文件2中读取lineB
继续循环
如果(关键线B>关键线A)
从文件1中读取lineA
持续
//此时,有了具有匹配关键点的lineA和lineB
处理数据
从文件2中读取lineB

请注意,内存中只有两条记录。

如果比较数据,请逐行进行。如果比较二进制文件或文件,请逐字节进行。我的直觉告诉我,行尾是我认为你还不知道的事情。我会先用Java代码替换伪代码。对于这样的操作,Java太慢了。你知道吗应该改为写在汇编中。:)评论的下一票按钮在哪里??)@Jashaszun这只是为了我自己的分析几次,不是为了生产,所以在我做其他事情的时候,等一个小时让它在Java中运行要比学习用汇编编写快。如果你在比较数据,就一行一行地比较。如果你在比较二进制或文件,就一个字节一个字节地比较。我的直觉告诉我,行尾是我不知道的nk你还不知道。我会先用Java代码替换伪代码Java对于这样的操作来说太慢了。你应该用汇编来编写它。:)评论的下一票按钮在哪里??:@Jashaszun这只是为了我自己的分析几次,不是为了生产,所以等一个小时让它在Java中运行,而我不这样做r东西比学会在汇编中编写要快。文件之间有细微的差别,比如一个文件可能有20个小数位,而另一个文件可能有一个小数位。一个文件使用无穷大,而另一个文件为无穷大提供了一个非常大的数字。我知道如何在java中解决这些差别……我只是不知道如何解决将如此多的数据放入ArrayList,而不首先将它们拆分为多个文件。这些文件有细微的差异,比如一个文件可能有20位小数,而另一个文件可能有一位小数。一个文件使用无穷大,而另一个文件给出了非常大的无穷大数字。我知道如何在java…我只是不知道如何将这么多数据放入ArrayList,而不首先将它们拆分为多个文件。+1表示尝试帮助。与我给Dale Wilson留下的注释相同。+1表示尝试帮助。与我给Dale Wilson留下的注释相同。