按列合并多个csv文件的最快方法是什么?

2024-03-28 14:11:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有大约50个CSV文件,每个文件有60000行,列的数量也不尽相同。我想按列合并所有CSV文件。我在MATLAB中尝试过这样做:将每个csv文件转置并重新保存到磁盘,然后使用命令行将它们连接起来。这花了我的电脑一个多星期,最后的结果需要再次转换!我必须再这样做,我正在寻找一个解决方案,不会再花一个星期。任何帮助都将不胜感激。


Tags: 文件csv命令数量解决方案磁盘电脑matlab
3条回答

水平连接真的很简单。考虑到你知道C++,我很惊讶你使用MATLAB。以这种方式处理一GB左右的数据应该是几秒钟,而不是几天。

根据您的描述,实际上不需要CSV处理。最简单的方法是在RAM中完成。

vector< vector<string> > data( num_files );

for( int i = 0; i < num_files; i++ ) {
    ifstream input( filename[i] );
    string line;
    while( getline(input, line) ) data[i].push_back(line);
}

(执行明显的健全性检查,例如确保所有向量的长度相同…)

现在你拥有了一切,扔掉它:

ofstream output("concatenated.csv");

for( int row = 0; row < num_rows; row++ ) {
    for( int f = 1; f < num_files; f++ ) {
        if( f == 0 ) output << ",";
        output << data[f][row];
    }
    output << "\n";
}

如果你不想使用所有的内存,你可以一行一行地做。您应该能够同时打开所有文件,并将ifstream对象存储在vector/array/list中。在这种情况下,您只需从每个文件中一次读取一行并将其写入输出。

[...] transposing each csv file and re-saving to disk, and then using the command line to concatenate them [...]

听起来像转置猫转置。使用paste水平连接文件。

paste -d ',' a.csv b.csv c.csv ... > result.csv

可以设置Python^{}模块,使每个记录都是一个以列名为键的字典。您应该能够以字典的形式读入所有文件,并将其写入包含所有列的输出文件。

Python很容易使用,所以对于任何语言的程序员来说,这都应该是相当简单的。

如果你的csv文件没有列标题,这将是相当多的手工工作,虽然,那么这也许不是最好的解决方案。

由于这些文件相当大,最好不要一次将它们全部读入内存。我建议您首先只打开它们以将所有列名收集到一个列表中,然后使用该列表创建输出文件。然后,可以将每个输入文件连接到输出文件,而不必将所有文件都放在内存中。

相关问题 更多 >