我有两个csv文件(A,B)。
档案A
ADDRESSLINKID;NAMEINDEX;ADDRESSLINKINDEX;ADMINREGIONID;TOWNREGIONID;SIDE
1;19;;;1;0
2;21;;;2;0
3;23;;;3;0
文件B
ID;DISPLAYTYPE;URBAN;LINKLENGTH;PARENTID;SOURCEID;TRUCKTOLL
1;19;;;;1;0
2;21;;;;2;0
3;23;;;;3;0
现在我将读出文件B中的字段“SourceID”,其中文件A字段“adresslinkid”存在(读取sourceid,其中adresslinkid eq sourceid)!
sub check_segments {
my $fileA = $dirA."\\lux.adl";
my $fileB = $dirA."\\lux.lin";
open my $fh, '<', $fileA or die "Could not open '$fileA' $!\n";
...
我可以用grep运算符来实现吗???
输出应该是: 结果=(1,2,3,4 ......)
答案 0 :(得分:1)
我对您的问题或您尝试解决方案的印象不是很深刻,只能打开文件
尽管如此,这是一个可以完成我认为你想要的工作程序
use strict;
use warnings 'all';
use List::Util 'first';
my $file_a = 'fileA.txt';
my $file_b = 'fileB.txt';
my @link_ids = fetch_file_column($file_a, 'ADDRESSLINKID');
my @source_ids = fetch_file_column($file_b, 'SOURCEID');
my %link_ids = map { $_ => 1} @link_ids;
my @result = grep { $link_ids{$_} } @source_ids;
printf "result = (%s)\n", join ',', @result;
sub fetch_file_column {
my ($file, $column) = @_;
open my $fh, '<', $file or die qq{Unable to open "$file" for input: $!};
my @headers;
for ( scalar <$fh> ) {
chomp;
@headers = split /;/;
}
my $idx = first { $headers[$_] eq $column } 0 .. $#headers;
die qq{Header "$column" not found in "$file"} unless defined $idx;
map { chomp; ( split /;/ )[$idx]; } <$fh>
}
result = (1,2,3)
答案 1 :(得分:1)
Perl可以使用SQL statements通过DBI对CSV文件执行DBD::CSV。
以下示例要求您输入的文件名为file_a.csv
和file_b.csv
。文件必须位于当前目录中。如果您的文件位于其他位置,请更改f_dir
。
#! /usr/bin/perl
use strict;
use warnings;
use DBI;
my $dbh = DBI->connect ('dbi:CSV:', '', '',
{ f_dir => '.',
f_ext => ".csv/r",
csv_sep_char => ';' })
|| die "$DBI::errstr()";
$dbh->{RaiseError} = 1;
my $result = $dbh->selectall_arrayref ('
select sourceid
from file_a, file_b
where file_a.addresslinkid = file_b.sourceid
');
print 'result = (', join (',', map { @$_ } @$result), ")\n";
在Ubuntu上,这需要以下软件包libdbd-csv-perl
,libsql-statement-perl
。