1

我有大约 350000 个单列 csv 文件,它们基本上是 200 - 2000 个数字,一个接一个地打印。数字格式如下:“-1.32%”(无引号)。我想合并文件以创建一个 csv 文件的怪物,其中每个文件都是一个单独的列。合并后的文件最多有 2000 行(每列可能有不同的长度)和 350000 列。

我想用 MySQL 来做,但是有 30000 列的限制。awk 或 sed 脚本可以完成这项工作,但我不太了解它们,我担心这需要很长时间。如果解决方案需要,我可以使用服务器。有什么建议么?

4

1 回答 1

0

这个 python 脚本会做你想做的事:

#!/usr/bin/env python2

import os
import sys
import codecs

fhs = []
count = 0
for filename in sys.argv[1:]:
    fhs.append(codecs.open(filename,'r','utf-8'))
    count += 1

while count > 0:
    delim = ''
    for fh in fhs:
        line = fh.readline()
        if not line:
            count -= 1
            line = ''

        sys.stdout.write(delim)
        delim = ','
        sys.stdout.write(line.rstrip())
    sys.stdout.write('\n')

for fh in fhs:
    fh.close()

使用您要合并的所有 CSV 文件调用它,它会将新文件打印到标准输出。

请注意,您不能一次合并所有文件;首先,您不能将 350,000 个文件名作为参数传递给进程,其次,一个进程一次只能打开 1024 个文件。

所以你必须分几次做。即合并文件 1-1000,然后 1001-2000 等。然后您应该能够一次合并 350 个生成的中间文件。

或者您可以编写一个包装脚本,用于os.listdir()获取名称或所有文件并多次调用此脚本。

于 2013-07-17T14:43:15.000 回答