我有一个非常大的tsv文件(1.2GB,5列,38米行)。我想删除一列,添加一列ID(1到38米),然后重新排列列顺序。如果不使用荒谬的内存,我怎么能这样做呢?
选择的语言是Python,但对其他解决方案持开放态度。
答案 0 :(得分:2)
您可以一次读取,操作和写入一行。不将整个文件加载到内存中,这将具有非常低的内存签名。
import csv
with open(fileinpath, 'rb') as fin, open(fileoutpath, 'wb') as fout:
freader = csv.reader(fin, delimiter = '\t')
fwriter = csv.writer(fout, delimiter = '\t')
idx = 1
for line in freader:
line[4], line[0] = line[0], line[4] #switches position between first and last column
del line[3] #delete fourth column
line.insert(0, idx)
fwriter.writerow(line)
idx += 1
(这是用python2.7编写的,删除第四列的例子)
关于重新排列顺序 - 我假设它是列的顺序 - 这可以在操作部分中完成。这是一个切换第一列和最后一列的顺序的例子。
答案 1 :(得分:1)
您可以使用awk
来执行此操作,我不会说1.2GB会占用大量内存。
如果你想删除c3
awk -F"\t" 'BEGIN{OFS="\t"}{print $1,$2,$4,$5,NR}' input.txt > output.txt
原始输出是 c1 c2 c4 c5 columnId(1至38m)
$ 1是coloumn1,$ 2是column2,依此类推。 NR是行数。
如果您想重新排列,只需更改$ 1,$ 2,$ 4,$ 5和NR的订单,
答案 2 :(得分:1)
答案很大程度上取决于需要多少上下文来重写行并确定新的顺序。
如果可以在不考虑上下文的情况下重写各行(取决于ID号的派生方式),那么您可以使用csv
模块来读取@Tal Kremerman说明的逐行文件,并以相同的顺序逐行写出。如果您此时可以确定行的正确顺序,那么您可以添加一个额外的字段,指示它们应该出现的新顺序。
然后你可以做第二遍来将线排序/重新排列成正确的顺序。最近有许多线程"如何使用Python"对大型文件进行排序,例如How to sort huge files with Python? 我认为Tal Kremerman是正确的,OP只想重新排列列,而不是行