我有一个大数据集 ~ 100 GB,有较小的 csv 文件 ~ 100,000。我希望以最快的方式将所有 .csv 文件合并在一起。文件位于两个不同的文件夹中。
- 有人建议我创建两个文件,其中包含两个文件夹中文件的文件名,并使用文件名在目录中迭代以附加输出文件,而不是使用 glob
ls *
。我如何使用 Linux 来实现这一点。我对此还很陌生,如果有人能帮助我,我将不胜感激。 - 如果有其他方法,考虑数据集,来实现结果
答案1
如果我理解正确的话,您想从所有文件创建一个(100GB 大小?)文件。在这种情况下,猫可能会这么做:
cat foo1 foo2 bar1 bar2 > newfile
或者在你的情况下
cat folder1/* folder2/* > newfile
这将获取 folder1 和 folder2 中的所有文件并将它们(作为文本)合并到 newfile 中。请注意,cat 只是将文件附加在末尾(即添加行)
然而,这将保留旧文件,因此您将需要两倍的空间,因此您也可以单独处理它们:
for f in folder1/* folder2/* ; do
cat $f >> newfile && rm $f
done
这样每个文件都会被添加然后删除。
这就是您正在寻找的吗?
答案2
尝试这样的事情:
find /path/to/dir1 /path/to/dir2 -type f -name '*.csv' -exec cat {} + >/path/to/merged.csv
确保不要将合并的文件放在任何一个输入目录中。 :)
答案3
如果所有 CSV 文件具有相同的结构(标头),并放置在 2 级子目录中,您可能需要使用 DuckDB,它可以使用具有 32GB 或64GB 内存
以下是获取所有文件的方法:
CREATE TABLE merge AS SELECT * from read_csv_auto('*/*/*.csv');
快速浏览生成的表格
SUMMARIZE SELECT * from merge;
最后,导出到单个 csv 文件
COPY merge TO 'export.csv' (HEADER, DELIMITER ',');