【问题标题】:Create a 350000 column csv file by merging smaller csv files通过合并较小的 csv 文件创建一个 350000 列的 csv 文件
【发布时间】:2013-07-15 23:53:59
【问题描述】:

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

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

【问题讨论】:

  • 你如何匹配行?还是他们都只是从顶部开始?
  • cat file1 file2... > hugeFile 呢?
  • Powershell 可能很容易做到这一点
  • -它们都从顶部开始-cat 不会将列一个接一个地放置(它只是将它们附加到底部)

标签: sql csv unix large-data-volumes large-data


【解决方案1】:

这个 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 个文件。

因此,您必须分几次完成。 IE。合并文件 1-1000,然后 1001-2000 等。然后您应该能够一次合并 350 个生成的中间文件。

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

【讨论】:

  • 我用java做了一个类似的程序。谢谢
猜你喜欢
  • 2014-12-10
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
相关资源
最近更新 更多