2016-10-19 4 views
0

私はCSVファイルを持って、id、firstname、lastnameという3つの列を持つことができます。 私はこのファイルをTSVファイルに変換するためにText :: CSVを使用していますが、id列も削除する必要があります。Text :: CSVモジュールを使用してPerlでCSVファイルの列をフィルタリングする方法は?

このコードは終了しましたが、間違って目的の列がエクスポートされます。最後のファイルにはファーストネーム、ラストネームヘッダーが含まれていますが、代わりにIDとファーストネームが使用されます。

my $fhin; 
open($fhin, "<", "input.csv"); 
my $fhout; 
open($fhout, ">", "output.tsv"); 
my $csv = Text::CSV->new({binary => 1}); 
my $tsv = Text::CSV->new({binary => 1, sep_char => "\t", eol => "\n", quote_char => undef}); 
$csv->column_names(qw(firstname lastname)); 
$tsv->column_names(qw(firstname lastname)); 
while (my $row = $csv->getline_hr($fhin)) { 
    $tsv->print_hr($fhout, $row); 
} 
close($fhin); 
close($fhout); 

は、私がここにドキュメントをお読みください。 http://search.cpan.org/~makamaka/Text-CSV-1.33/lib/Text/CSV.pm

私のコードで何が悪いのでしょうか?

input.csv実際

firstname lastname 
1  John 
+0

コードに2つの欠落部分を追加しました(最初のnew()呼び出し)。 – papaiatis

答えて

2

output.tsv

firstname lastname 
John   Doe 

を期待output.tsv

"id","firstname","lastname" 
1,John,Doe 

は、私は考えていない

$csv->column_names(qw(firstname lastname)) 

あなたはそれが何をすると思いますか。ファイルのヘッダー行にデータを組み込み、名前「firstname」と「lastname」(つまり2番目と3番目の列)に対応する列への参照を生成すると考えられます。しかし、実際に入力ファイルで行うことは、ヘッダー行にあるものに関係なく、名前を入力の列に関連付けることです。つまり、第1列には「firstname」、第2列には「lastname」という名前が割り当てられます。あなたは*

$csv->column_names(qw(id firstname lastname)); 

に次の行を変更した場合

あなたのコードは*に動作します - あなたはまた、入力に"id","firstname"間の浮遊容量を削除するか、で設定allow_loose_quotes => 1を使用するかしたいです$csvのコンストラクタです。

+0

ああ、そう簡単!私はすでにあまりにも疲れていました。入力ファイルは大丈夫です。余分なスペースを間違って書きました。ありがとうございました! – papaiatis

関連する問題