从 3 个大型 tsv/csv 文件中提取和组合数据

问题描述

我有 3 个具有以下结构的大 tsv 文件

 file1 : id,f1,f2,name,f3
 file2 : id,f4,blah1,f5
 file3 : id,f5,f6,blah2

我想创建从其他文件提取的第三个文件

 result: id,blah2

目前我不能,因为只是尝试加载 panda|vaex 中的一个文件会使进程崩溃,因为它试图读取整个文件..

怎么做..?

我将在 vaex 中使用生成文件......我认为它仍然是 ~1G


f1 = vaex.read_csv('stuff.tsv',convert=True,sep='\t') 

然后:

f1.join(f2,left_on='id',right_on='id')

解决方法

'convert' 不会将文件加载到内存中......而是分块工作

f1 = vaex.read_csv('stuff.tsv',convert=True,sep='\t') 
f2 = vaex.read_csv('stuff2.tsv',sep='\t') 

fx1 = f1['id','blah1']
fx2 = f2['id','blah2']

然后:

ff = fx1.join(fx2,left_on='id',right_on='id')
ff.export_hdf5('file.hdf5')
,

这样的策略可能会让您的工作更轻松。它跟踪按 merged_items 跟踪项目的 id dict,并保存 nameblah1blah2 的值。然后,使用 csvreader,它逐行迭代每个文件,而不是一次全部迭代,以减少在任何时候使用的必要内存。最后,它再次逐行写出项目。您需要修改它以适合您的确切用例,但这应该是一个不错的开始。

merged_items = {}

with open ('file1.csv','r') as csv_file:
    reader = csv.reader(csv_file)
    next(reader) # skip first row
    for row in reader:
        row_id = row[0]
        name = row[3]
        merged_items[row_id] = {'name':name}


with open ('file2.csv','r') as csv_file:
    reader = csv.reader(csv_file)
    next(reader) # skip first row
    for row in reader:
        row_id = row[0]
        blah1 = row[2]
        merged_items[row_id]['blah1'] = blah1


with open ('file3.csv','r') as csv_file:
    reader = csv.reader(csv_file)
    next(reader) # skip first row
    for row in reader:
        row_id = row[0]
        blah2 = row[3]
        merged_items[row_id]['blah2'] = blah2

with open('output.csv','w',newline='') as output:
    writer = csv.writer(output,delimiter='\t') # change these options as you see fit
    for id,metadata in merged_items.items():
        writer.writerow([id,metadata['name'],metadata['blah1'],metadata['blah2'])

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...