我有一个从票务系统中提取的CSV文件(我没有直接的数据库访问权限),需要在另一个数据库中添加几个列,然后再在Excel中创建报表。
我正在使用Perl从其他数据库中提取数据,并希望在处理文件时将其他列附加到每行的末尾。
有没有办法在不必基本上创建新文件的情况下执行此操作?基本结构是:
foreach $line (@lines) {
my ($vars here....) = split (',',$line);
## get additional fields
## append new column data to line
}
答案 0 :(得分:7)
您可以查看DBD::CSV将文件视为数据库(也可以处理转义特殊字符)。
答案 1 :(得分:3)
您可以使用Tie :: File(自Perl 5.8以来的Perl核心)来修改文件:
#!/usr/bin/perl
use strict;
use warnings;
use Tie::File;
my $file = shift;
tie my @lines, "Tie::File", $file
or die "could not open $file: $!\n";
for my $line (@lines) {
$line .= join ",", '', get_data();
}
sub get_data {
my $data = <DATA>;
chomp $data;
return split /-/, $data
}
__DATA__
1-2-3-4
5-6-7-8
您还可以使用@ ARGV /&lt;&gt;进行就地编辑。设置$ ^ I的技巧:
#!/usr/bin/perl
use strict;
use warnings;
$^I = ".bak";
while (my $line = <>) {
chomp $line;
$line .= join ",", '', get_data();
print "$line\n";
}
sub get_data {
my $data = <DATA>;
chomp $data;
return split /-/, $data
}
__DATA__
1-2-3-4
5-6-7-8
答案 2 :(得分:1)
尽管有很好的接口,但你必须逐行读取文件。如果某些引用的字段可以嵌入换行符,您甚至可能需要做更多的操作。使用了解CSV的东西来避免一些问题。 Text::CSV_XS可以为你节省大部分奇怪的麻烦。
答案 3 :(得分:0)
考虑使用-i
选项来就地编辑<>
个文件。