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

Python 什么';按列合并多个csv文件的最快方法是什么?,python,csv,merge,Python,Csv,Merge,我有大约50个CSV文件,每个文件中有60000行,列数也不尽相同。我想按列合并所有CSV文件。我曾尝试在MATLAB中通过转置每个csv文件并重新保存到磁盘,然后使用命令行连接它们来实现这一点。这花了我一个多星期的时间,最终结果需要再次转换!我必须再做一次,我正在寻找一个不会再花一周时间的解决方案。任何帮助都将不胜感激。可以设置Python模块,以便每个记录都是一个以列名为键的字典。通过这种方式,您应该能够将所有文件作为字典读入,并将它们写入包含所有列的输出文件 Python易于使用,因此对于

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

可以设置Python模块,以便每个记录都是一个以列名为键的字典。通过这种方式,您应该能够将所有文件作为字典读入,并将它们写入包含所有列的输出文件

Python易于使用,因此对于任何语言的程序员来说,这应该是相当简单的

如果您的csv文件没有列标题,那么这将是相当多的手工工作,因此这可能不是最好的解决方案


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

水平连接确实很简单。考虑到你知道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);
}
vector数据(num_文件);
对于(int i=0;i
(进行明显的健全性检查,例如确保所有向量长度相同…)

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

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";
}
流输出的
(“concatenated.csv”);
对于(int row=0;row
听起来像转置猫转置。用于水平连接文件

paste -d ',' a.csv b.csv c.csv ... > result.csv
水平连接。假设所有文件具有相同的长度。内存开销低,速度快

答案适用于Python 2。在Python 3中,打开csv文件略有不同:

readers = [csv.reader(open(fn, 'r'), newline='') for fn in csv_names]
writer = csv.writer(open('result.csv', 'w'), newline='')
使用Go:

假设有文件“a.csv”包含字段“a1、a2、a3、a4、a5”

并假设文件“b.csv”具有字段“b1、b2、b3”

我们想要连接a1=b2的行,输出格式应该是“a1,a4,b3”


你知道Perl,甚至有一点吗?不,一点也不。我知道C和C++。50行60000行听起来不太像。数据的总大小是多少?它不适合内存吗?每个文件有60000行,在100-200列之间(按文件变化)。每个文件大约有40-50 MB。我的MATLAB代码只是将csv读入一个单元格数组,将其转置并保存回来。这花了一周时间。然后,我将所有转置的csv连接起来,只花了一两分钟。我不知道为什么速度这么慢。我只是不想在MATLAB中再次这样做。我的文件确实有标题。我只想要所有的文件水平连接。对于所涉及的文件大小,这可以快速完成吗?(检查对问题的评论)。@ankit:是的,没问题。更新了答案。(这是一个有趣的问题,如果我有时间,我会为你做,但我没有,我必须迎合客户。:-))嘿,Lennart,在你走之前,你能列出我需要的函数/方法的名称吗?我可以用谷歌搜索它们的用法,然后自己计算出其余的。谢谢:)@ankit:好了,一切都在这里:确保你使用的是Python版本的文档。在Python 2和Python 3中使用它的方式有细微的区别。据我所知此外,还涉及到一些CSV操作,这意味着您还必须解析CSV。所以这还不够。伟大的解决方案-它甚至可以合并甚至不会加载到内存中的非常大的CSV文件(例如,在python中)。该操作是逐行完成的,因此没有内存问题。如果需要匹配第一列,则还有
join
readers = [csv.reader(open(fn, 'r'), newline='') for fn in csv_names]
writer = csv.writer(open('result.csv', 'w'), newline='')
package main

import (
    "os"

    "github.com/chrislusf/gleam"
    "github.com/chrislusf/gleam/source/csv"
)

func main() {

    f := gleam.New()
    a := f.Input(csv.New("a.csv")).Select(1,4) // a1, a4
    b := f.Input(csv.New("b.csv")).Select(2,3) // b2, b3

    a.Join(b).Fprintf(os.Stdout, "%s,%s,%s\n").Run()  // a1, a4, b3

}