合并CSV文件

时间:2011-07-14 20:22:58

标签: linux perl programming-languages

组合两个csv文件并将结果附加到perl中的同一行的最佳方法是什么?

例如,一个CSV文件看起来像

1234,user1,server
4323,user2,server
532,user3,server

第二个看起来像

user1,owner
user2,owner
user3,owner1

我希望它的结果是

1234,user1,server,owner
4323,user2,server,owner
532,user3,server,owner1

用户不在线,所以我需要搜索我存储在数组中的第一个csv文件,以查看哪些用户匹配,然后将所有者应用到行尾。

到目前为止,我已将这两个文件读入数组,然后我迷路了

我会发布代码,但它是更大脚本的一部分

4 个答案:

答案 0 :(得分:4)

这听起来最适合哈希。首先将一个文件读入哈希,然后添加另一个。可能会为一个文件中存在但不存在另一个文件的值添加警告。

类似的东西:

use warnings;
use strict;
use Text::CSV;
use autodie;

my %data;
my $file1 = "user.csv";
my $file2 = "user2.csv";

my $csv = Text::CSV->new ( { binary => 1 } );

open my $fh, '<', $file1;
while (my $row = $csv->getline($fh)) {
    my ($num, $user, $server) = @$row;
    $data{$user} = { 'num' => $num, 'server' => $server };
}

open $fh, '<', $file2;
while (my $row = $csv->getline($fh)) {
    my ($user, $owner) = @$row;
    if (not defined $data{$user}) {
         # warning? something else appropriate
    } else {
         $data{$user}{'owner'} = $owner;
    }
}

for my $user (keys %data) {
    print join(',', $data{$user}{'num'}, $user, $data{$user}{'server'}, 
         $data{$user}{'owner'}), "\n";
}

修改:根据评论和其他答案中的建议,我将提取数据的方法更改为使用Text::CSV而不是split。我对模块不太熟悉,但它似乎在我的测试中工作。

答案 1 :(得分:2)

看起来像是join命令的直接应用程序(与sort绑定)。这假设数据如图所示那么简单 - 没有逗号嵌入字符串或任何令人讨厌的内容。

sort -t, -k 2 file1 > file1.sorted
sort -t, -k 1 file2 > file2.sorted
join -t, -1 2 -2 1 file1.sorted file2.sorted

使用bash,您可以在一行中完成所有操作。

如果你真的想在Perl中这样做,那么你需要使用用户列键入的哈希值,可能每个哈希键都有一个条目数组。然后迭代其中一个哈希的键,从另一个中提取匹配值并打印数据。如果您使用的是Perl,则可以使用Text :: CSV模块进行准确的CSV分割。

答案 2 :(得分:0)

假设第一个有2个逗号,第二个只有一个,你将得到第一个文件的所有行,但只有第二个匹配的那些:

my %content;
while( <$file1> ) {
    chomp;
    /,(.+),/;
    $content{$1} = "$_,";
}
while( <$file2> ) {
    chomp;
    /(.+),(.+)/;
    $content{$1} .= $2;
}
print "$content{$_}\n" for sort keys %content;

答案 3 :(得分:0)

导入csv

files = ['h21.csv','h20.csv','h22.csv'] lineCount = 0

对于文件中的文件: 使用open(file,'r')as f1: csv_reader = csv.reader(f1,delimiter =',') 与open('testout1.csv','a',newline ='')为f2: csv_writer = csv.writer(f2,delimiter =',') 如果lineCount == 0: csv_writer.writerow([“文件名”,“ sno”,“名称”,“年龄”]) lineCount + = 1

        next(csv_reader,None)
        for row in csv_reader:
            data=[file]+row
            csv_writer.writerow(data)