如何将字符附加到文件中的一行?

时间:2009-06-03 13:49:51

标签: perl

我有一个从票务系统中提取的CSV文件(我没有直接的数据库访问权限),需要在另一个数据库中添加几个列,然后再在Excel中创建报表。

我正在使用Perl从其他数据库中提取数据,并希望在处理文件时将其他列附加到每行的末尾。

有没有办法在不必基本上创建新文件的情况下执行此操作?基本结构是:

foreach $line (@lines) {
    my ($vars here....) = split (',',$line);
    ## get additional fields
    ## append new column data to line
}

4 个答案:

答案 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选项来就地编辑<>个文件。