- 締切済み
外部ファイルからの指定行と指定文字の削除
perlで、外部のCSVファイル(01_01.csv)を読み込み、「先頭の9行」とその行以降の「先頭9文字」を削除したものを [01_01_out.csv]として保存したいのですがどのようにしたらいいのでしょうか。 ご回答、よろしくお願い致します。 例) 読込ファイル:01_01.csv ---------------------------------------- AAA BBB CCC DDD EEE FFF GGG HHH 00:00:00,1 00:01:00,2 00:02:00,3 00:03:00,4 00:04:00,5 00:05:00,6 (略) 10:00:00,101 10:01:00,102 10:02:00,103 10:03:00,104 10:04:00,105 10:05:00,106 ---------------------------------------- 出力ファイル:01_01_out.csv ---------------------------------------- 1 2 3 4 5 6 (略) 101 102 103 104 105 106 ----------------------------------------
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- hok212
- ベストアンサー率66% (100/150)
回答2さんの手法でOKだと思いますが、もっと基礎的で泥臭い手法を説明すると。。。 #まずは01_01.CSVの各行を配列 @lines に格納します。 open (FH,"01_01.csv"); @lines = <FH>; close(FH); #次に foreachループを使って、@lines から1要素ずつ読んであげます。 #つまり、CSVファイルを1行読んで、その値を変数 $line に代入します。 #ただし先頭の9行は不要なので、変数 i が9以下であれば次のループへ飛ばします(nextの部分)。 #split 関数は文字列を分解するときに使うもので、今回はCSVファイルなので、 #区切り文字にカンマ( /\,/ の部分)を指定しています。 #split関数の左辺は、分割して得られた値となります。 #CSVファイルの10行目であれば、$first が 00:00:00 で、 $second が 1 となります。 #pushは配列に要素を追加するときに使う関数なので、foreachが回るたびに要素が追加されていきます。 #今回はカンマで区切られた2番目の値を得たいので、$second を配列要素として @optput に追加します。 $i = 1; foreach $line (@lines) { if ($i <= 9) { $i++; next; } ($first,$second) = split(/\,/,$line); push(@output,"$second\n"); } これで 配列 @output に 10行目以下のカンマで区切られた2番目の値が改行付きで入りましたので、 あとは別のファイルに書き出すだけです。 open (FH,">01.csv"); print FH @output; close(FH); 以上がCSVファイルを分解するときの基本です。 あとは、値が二重引用符で囲われていた場合にどうするか等、上記の手法を応用させるだけです。 ※ 12345,"あいう,000",ABC (応用パターンの一例CSV)
- MillenniuM
- ベストアンサー率58% (42/72)
もし、Perlでなくて良いなら、tailとcutを使って、 tail -n +10 CSV_FILE | cut -d, -f2- 10 は 9+1 で10行目から表示せよの意味、 2- は , を区切りにした2カラム目以降表示せよの意味。 こういうやり方もありますよという事で。
- ORUKA1951
- ベストアンサー率45% (5062/11036)
>例文が間違っていました。。。 #!/usr/bin/perl use strict; open (IN,"01_01.csv"); open (OUT,">01.csv"); while(<IN>){ if ( /\d+,(\d+)$/ ){ print OUT "$1\n"; } } close IN; close OUT;
- ORUKA1951
- ベストアンサー率45% (5062/11036)
というより #!/usr/bin/perl use strict; open (IN,"01_01.csv"); open (OUT,">01.csv"); while(<IN>){ if ( /,(\d+)$/ ){ print OUT "$1\n"; } } close IN; close OUT;
補足
すみません。 例文が間違っていました。。。 下記が読み込むファイルとなっています。。。 読込ファイル:01_01.csv ---------------------------------------- AAA,10 BBB,10 CCC,ZZZ DDD,ZZZ EEE,10 FFF,10 GGG,10 HHH,10 00:00:00,1 00:01:00,2 00:02:00,3 00:03:00,4 00:04:00,5 00:05:00,6 (略) 10:00:00,101 10:01:00,102 10:02:00,103 10:03:00,104 10:04:00,105 10:05:00,106 ----------------------------------------