Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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
Python 从文件中提取与另一个文件中的条件匹配的某些行_Python_C++_Text_Extract - Fatal编程技术网

Python 从文件中提取与另一个文件中的条件匹配的某些行

Python 从文件中提取与另一个文件中的条件匹配的某些行,python,c++,text,extract,Python,C++,Text,Extract,首先,我知道类似的问题有一些答案,但是…我的问题与速度和内存效率有关 我有一个60 GB的文本文件,有17个字段和460368082条记录。第3列具有个人ID,同一个人在此文件中可以有多条记录。我们将此文件称为文件A 我还有第二个文件,文件B,它的ID为1000000个人,我想提取文件a中ID位于文件B中的行 我有一台windows PC,我愿意用C或Python或其他更快的语言来完成这项工作。。。但不知道如何快速有效地完成 到目前为止,根据我的计算,我提出的每一个解决方案都需要超过1.5年。这

首先,我知道类似的问题有一些答案,但是…我的问题与速度和内存效率有关

我有一个60 GB的文本文件,有17个字段和460368082条记录。第3列具有个人ID,同一个人在此文件中可以有多条记录。我们将此文件称为
文件A

我还有第二个文件,
文件B
,它的ID为1000000个人,我想提取
文件a
中ID位于
文件B
中的行

我有一台windows PC,我愿意用C或Python或其他更快的语言来完成这项工作。。。但不知道如何快速有效地完成


到目前为止,根据我的计算,我提出的每一个解决方案都需要超过1.5年。

这取决于,如果它未排序,您将不得不搜索整个问题,我将使用多个线程。如果你要做这个搜索多次,我也会创建一个索引

如果你有大量的内存,你可以创建一个哈希表来保存字符串。然后可以将第一个文件中的所有字符串加载到哈希表中。然后,从第二个文件一次加载一个字符串。对于每个字符串,检查它是否在哈希表中。如果是,请报告匹配项。这种方法使用O(m)内存(其中m是第一个文件中的字符串数),并且至少需要Ω(m+n)时间,可能需要更多时间,这取决于哈希函数的工作方式。这也是(几乎可以肯定)解决问题的最简单和最直接的方法


如果您只有很少的ram可供使用,但有大量的磁盘空间:,那么您可以将其保存到O(n log n)时间。

听起来您想做的是首先读取
文件B
,收集ID。您可以将ID存储在
集合
目录


然后读取
文件A
。对于
文件A
中的每一行,提取ID,然后通过检查
集合
目录
中的成员身份,查看它是否在
文件B
中。如果没有,则跳过该行并继续下一行。如果是,则根据需要处理该行。

您要查找的是排序合并联接。其思想是根据要加入的列(ID)对文件进行排序。对要加入的列(ID)上的文件B进行排序。然后使用合并算法读取两个文件,忽略两个文件中不匹配的文件

对文件进行排序可能需要创建中间文件

如果数据位于带有分隔符的文本文件中,还可以使用linux排序命令行实用程序执行排序

 sort -k3,3 -t'|' fileA > fileA.sorted
 sort fileB > fileB.sorted
 dos2unix fileB.sorted  #make sure the line endings are same style
 dos2unix fileA.sorted  #make sure the line endings are same style
如果dos2unix不可用,可以将其用作替代方案

 sort -k3,3 -t'|' fileA | tr -d '\r' > fileA.sorted
 sort fileB | tr -d '\r' > fileB.sorted
加入文件

 join -1 3 -2 1 -t'|' fileA.sorted fileB.sorted

另一个选项是,如果您有足够的RAM,则可以在内存中以HashMap类型的结构加载文件B。然后读取文件A,并查找HashMap以查找匹配项。我认为这两种语言都可以,这取决于你对哪种语言更满意。

嗨,谢谢你的帮助。我对这两种语言都不是很精通,但有了一定的指导,我想我能做到。。。我担心的一件事是:1)sort不会将文件加载到内存中(由于文件A太大,它将无法这样做);2)join不会也将文件加载到内存中吗?然后我遇到了与上面相同的问题..sort将在需要时使用临时文件来处理大文件。检查man sort以获取设置临时目录的信息。Join不需要在内存中读取超过一小部分的内容,因为文件已经排序。Thhanks。。。好的,我可以访问linux计算机。。。但在windows shell中是否有这样做的方法?好的,我现在在Linux中运行这个。。。我遇到的问题是ID是一个数字,而Linux在出现这种情况时似乎是一团糟。我相信这是因为每一行的位数不一样。。。这里是一个数据链接,zip文件中的“小”文件只是60GB大数据中前1000行的一个示例filehttps://www.dropbox.com/s/tv48m9c9ph6rcsm/SampleData.rar?dl=0@MauricioRomero您拥有的文件没有使用相同类型的行尾。我已经更新了我的答案,以说明如何确保您具有相同类型的行尾。DOS/Windows使用CR/LF,Linux使用LF。在那之后,连接应该工作。