合并CSV文件

问题描述 投票:1回答:4

合并两个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文件,以查看匹配的用户,然后将所有者应用于行尾。

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

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

linux perl programming-languages
4个回答
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。我对模块不太熟悉,但是似乎可以在我的测试中使用。


2
投票
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拆分。

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

0
投票
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)

© www.soinside.com 2019 - 2024. All rights reserved.