提取两个txt文件中有相同文字的那行数据,并以同样格式存储到另一个新的txt文件中

smallfatQQ 发布于 2018/08/05 07:36
阅读 3K+
收藏 0

我有两个文件:

一个文件叫list.txt里面包含n个id,每个id一行

ZINC042-03-483
ZINC268-95-155
ZINC036-51-026

一个文件叫data.txt里面包含有n多行(上亿行)的信息,其中有些行中包含了list.txt中的id信息,如下仅列部分数据:

123    ZINC268-95-155
2323    ZINC036-51-026
231    ZINC042-03-483
1    ZINC042-03-4444  
444    ZddCyyy
6326    dgag
32323    yyj
211    ddghghd
3546    ZINC036-51-026

我希望通过list.txt文件里的3个ID在data.txt文件查找相对应的信息,然后将data.txt中整行信息都输入到一个新的new.txt文件里。如果在list.txt中信息未在data.txt中查到,就在new.txt中仅显示list中的ID

请求大神帮助

加载中
0
tcxu
tcxu

引用来自“SupNatural”的评论

第二个大文件可以用readline()来逐行读取。

readStream1 = open("list.txt", "r");
context1 = readStream1.read();
a = context1.split('\n') # 从文档 list.txt 取得的关键词数组
size = len(a)
b = [ 0 ]*size # 对应关键字数组 a,创建一个整型数组 b,每个元素的初始值为零。
result = open("new.txt","w")
fo = open("data.txt", "r")
try:
  while True:
      line = fo.readline()
      if line:
           index= 0
           for v in a:
               if line.find(" " + v) > -1:
                   v = v + "  " + line
                   b[index] = b[index] + 1
                   result.write(v)
               index = index + 1
      else:
          break
finally:
    fo.close()

# 最后检查每个关键字是否在数据文档data.txt都有数据对应
index=0
result.write("\n")
for value in b:
    if value == 0:
        out = a[index]+"  NA     NA\n"
        result.write( out )
    index = index + 1
result.close()
readStream1.close()

list.txt

data.txt

new.txt

smallfatQQ
smallfatQQ
这个方法很好啊,内存使用率显著降低,正在跑程序,有了结果第一时间回复给您。谢谢您啊
1
SupNatural
SupNatural

第二个大文件可以用readline()来逐行读取。

SupNatural
SupNatural
回复 @smallfatQQ : 是的。
smallfatQQ
smallfatQQ
这么做是不是能减少内存的使用啊
tcxu
tcxu
好主意。
0
tcxu
tcxu
import os;
readStream1 = open("list.txt", "r");
context1 = readStream1.read();
a = context1.split('\n')
readStream2 = open("data.txt", "r");
context2 = readStream2.read();
b = context2.split('\n')
result = open("new.txt","w")
for v1 in a:
    result.write(v1+"\n")
    for v2 in b:
        if v2.find(v1) > -1:
            result.write(v2+"\n")
readStream1.close();
readStream2.close();
result.close();

输出 new.txt 文档内容 :

ZINC042-03-483
231    ZINC042-03-483
ZINC268-95-155
123    ZINC268-95-155
ZINC036-51-026
2323    ZINC036-51-026
3546    ZINC036-51-026

 

0
smallfatQQ
smallfatQQ

@tcxu

非常感谢你,可以运行!还没有在大样本的data上试试,但是已经能运行了。

输出结果还有个请求:能否像下面这样输出结果,如果搜索到结果后,直接导出该行到list中相应项后面;如果没有所搜到结果,则list中相应项只占个位置或者显示NA;

ZINC042-03-483    231    ZINC042-03-483
ZINC268-95-155    123    ZINC268-95-155
ZINC036-51-028    NA    NA

再此表示感谢

0
tcxu
tcxu

按要求,将代码稍加修改如下:

import os;
readStream1 = open("list.txt", "r");
context1 = readStream1.read();
a = context1.split('\n')
readStream2 = open("data.txt", "r");
context2 = readStream2.read();
b = context2.split('\n')
result = open("new.txt","w")
for v1 in a:
    count=0
    for v2 in b:
        if v2.find(v1) > -1:
            count=1 + count
            v = v1 + "  " + v2 + "\n"
            result.write(v)
    if count==0:
        result.write(v1 + "\tNA\tNA\n")
readStream1.close();
readStream2.close();
result.close();

文档 list.txt 修改成:

ZINC042-03-483
ZINC268-95-155
ZINC036-51-026
ZINC036-51-028

最终输出到 new.txt 的内容:

0
smallfatQQ
smallfatQQ

@tcxu

大样本的data上运行时,内存爆满了,请问这个程序是都在内存中存储,然后运行结束后再输出导入new.txt中的么?暂停后查看结果出现很多假阳性,如下:目标是99-96-97,出现了很多类似的搜索结果,可能会增加搜索时间和任务量,能否以全词匹配形式进行搜索,得到结果就导出到new.txt中存储呢?

135	99-96-7
135	CAS-99-96-7
171421	55199-96-7
175701	97399-96-7
195145	115399-96-7
1732122	791799-96-7
2468597	851399-96-7
3926056	754999-96-7
4173458	1019099-96-7
4826000	848299-96-7
5101983	398999-96-7
7162260	893999-96-7
8189729	1190299-96-7
9796068	937799-96-7
13689674	128899-96-7
14968138	144899-96-7
15287033	92599-96-7
15619712	84499-96-7
16219477	99-96-7 (Parent)
16375052	924099-96-7
16452895	898599-96-7
16869767	953199-96-7
17531919	1048999-96-7
19580798	937599-96-7
21574520	97399-96-7
23672310	99-96-7 (Parent)
32366490	1030699-96-7
42903401	1111499-96-7
44584798	97399-96-7
71322051	89099-96-7
71751303	128299-96-7
71855104	1394699-96-7
72717704	1797299-96-7
75463539	1797699-96-7
75472799	1797099-96-7
75521166	1797899-96-7
102540540	1352499-96-7
102547750	1420799-96-7
119087941	18799-96-7
131875386	18799-96-7
133561971	97399-96-7

 

 

 

0
注销_
注销_

MappedByteBuffer + KMP算法。自己去找。

0
g
gq_2010

把txt数据导入到数据库

0
公孙二狗
公孙二狗

把 2 个文件的信息都先处理一下,按 ID 排序生成新的文件,然后对新文件再进行匹配比较

0
公孙二狗
公孙二狗

还有一种方式就是先导入数据库,使用多表关联查询导出数据

返回顶部
顶部