2009-06-03 78 views
1

我有一个从票务系统中提取的CSV文件(我没有直接的数据库访问权限),并且需要在另一个数据库中添加一些列,然后才能在Excel中创建报告。如何将字符附加到文件中的一行?

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

有没有办法做到这一点,而不必基本上创建一个新的文件?其基本结构是:

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

回答

3

您可以使用领带::文件(在Perl的核心因为Perl 5.8)修改位置的文件:

#!/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/<就地编辑>招设置$^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 
+0

第二个选项适用于我,更少的图书馆下载等,也消除了从我的代码约10行。 – MattS 2009-06-03 15:38:04

0

考虑使用-i选项就地编辑<>文件。

7

你可以看看DBD::CSV来对待文件,就好像它是一个数据库(它也会为你处理转义的特殊字符)。

1

尽管任何漂亮的界面,最终你必须要读取文件中的行由行。如果一些引用字段可以嵌入换行符,则甚至可能需要做更多的事情。使用关于CSV的知识来避免某些问题。 Text::CSV_XS应该为您节省大部分奇怪情况的麻烦。

相关问题