2016-05-10 17 views
-1

私はCSVファイルを解析し、データをスクラブして元に戻す前にいくつかの変更を加える作業スクリプトを持っています。私が扱っていた元のファイルはコンマで区切られていました。しかし、私はこれに対して実行されるすべての実際のファイルを受け取りました。それらはすべてパイプで区切られています。私は同じことをする必要がありますし、カンマ区切りのファイルとしてそれらを一緒に戻す。コンマで区切られたパイプから?

#!/usr/bin/perl/ 

use strict; 
use warnings; 
use Data::Dumper; 
use Time::Piece; 

my $filename = 'records.csv'; 

open my $FH, $filename 
    or die "Could not read from $filename <$!>, program halting."; 

# Read the header line. 
chomp(my $line = <$FH>); 
my @fields = split(/|/, $line); 
print Dumper(@fields), $/; 

my @data; 
# Read the lines one by one. 
while($line = <$FH>) { 

    chomp($line); 

...私のデータを解析して、現在、私は、ファイルに戻ってデータを入れるためにこので終わる - -

だから、開始するには、私が持っている

# put the records back 
    push @data, \@fields; 

しかし、どのようにデータをカンマ区切りにして戻すのですか?

+0

私はこれがちょうど間違ったコピーだと仮定しますが、 'split(/ |/$行);' split(/ \ |/$行); ' – ThisSuitIsBlackNot

+2

* "同じことをする必要がありますカンマで区切ったファイルとしてまとめることができます」*いいえ、あなたはカンマではなくパイプ上のデータを分割し、そこから通常どおりに処理するだけです。新しいバグの層を導入するので、実際にあなたの "期待された"入力ファイルを作り直してはいけません。 – Borodin

+0

ありがとう@ThisSuitIsBlackNot - 実際にそこにあったコンマの代わりに素早くパイプを投げていました - 私は脱出が必要なのか分からなかった! – BigRedEO

答えて

1

いくつかあります。まず、シバン(#!行)を修正して、末尾に/が含まれないようにします。あなたが分割する際、パイプ文字をエスケープしたいと思うので、第二に、perlは、分割のための正規表現を使用しています

my @fields = split(/\Q|\E/, $line); 

最後に、あなたは文字列に配列の要素を結合するためにjoinを使用することができます。これは、正規表現ではなく文字列リテラルを使用します。

my $output_line = join(',', @fields); 
+0

変数$ output_lineを使用してデータを戻します。それを同じファイルに書き戻すにはどうしたらいいですか?それとも別のファイル名に移動する必要がありますか? – BigRedEO

+4

'split(/ \ Q | \ E /、$ line)'は通常 'split/\ |/$ line'と書かれています – Borodin

2

分割を使用してCSVファイルを解析しないでください。適切なパーサを使用してください。

use strict; 
use warnings 'all'; 
use autodie; 
use Text::CSV_XS; 

my $csv_in = Text::CSV_XS->new({ binary => 1, sep_char => "|" }); 
my $csv_out = Text::CSV_XS->new({ binary => 1, sep_char => ",", eol => $/ }); 
while (my $row = $csv_in->getline(*ARGV)) { 
    $csv_out->print(*STDOUT, $row); 
} 

それが本当であればあなたは自分のパイプにtr '|' ','を挿入し、区切りのカンマ区切りにパイプを変更する必要があります。

+0

私のスクリプトはすでに動作していました。ちょうど今、私はパイプで区切られたファイルを持っていて、それをスクラブしてカンマ区切りのファイルとして一緒に戻す必要があります。 Text :: CSVは私には利用できず、利用可能にもなりません。私が働いているもの私は今、パイプを考慮する必要があります。 – BigRedEO

関連する問題