2009-06-03 23 views
1

私はCSVファイルをチケット発行システムから抽出しました(私は直接DBにアクセスすることはできません)ので、Excelでレポートを作成する前に、別のデータベースからいくつかの列を追加する必要があります。ファイル内の行にどのように文字を追加できますか?

私は、他のデータベースからデータを取り出すためにPerlを使用しています。ファイルを処理するときに、各行の末尾に追加の列を追加したいだけです。

基本的に新しいファイルを作成せずにこれを行う方法はありますか?基本的な構造は次のとおりです。

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

答えて

3

あなたは(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/<とインプレース編集を使用することができます> $^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

2番目のオプションは私のために、ダウンロードするライブラリが少なくて済むなどです。私のコードから約10行も削除されました。 – MattS

+0

Tie :: Fileは5.8以降、Core Perlの一部となっています(よく5.7.3ですが、それはデベロッパーリリースです)。 –

+0

レコード内のどのフィールドも垂直の空白を持つことができない限り、これらは機能することに注意してください。それはばかげて聞こえるが、CSVで長時間プレイすると、最終的にそれをやる人に出くわすだろう。 :) –

0

は、インプレース<>ファイルを編集する-iオプションを使用することを検討してください。

7

DBD::CSVを見ると、ファイルをデータベースであるかのように扱うことができます(エスケープする特殊文字も処理します)。場所にファイルを変更する

1

いいインターフェイスがあるにもかかわらず、最終的にファイルを1行ずつ読みなければなりません。引用されたフィールドの中に改行を埋め込むことができるものがあれば、それ以上のことをする必要があるかもしれません。これらの問題のいくつかを回避するには、CSVを知っているものを使用してください。 Text::CSV_XSは、あなたにとって奇妙なケースの大半を省くはずです。

関連する問題