重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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
----------------------------------------

A 回答 (4件)

回答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)
    • good
    • 0

もし、Perlでなくて良いなら、tailとcutを使って、



tail -n +10 CSV_FILE | cut -d, -f2-

10 は 9+1 で10行目から表示せよの意味、
2- は , を区切りにした2カラム目以降表示せよの意味。
こういうやり方もありますよという事で。
    • good
    • 0

>例文が間違っていました。

。。
#!/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;
    • good
    • 0

というより


#!/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
----------------------------------------

補足日時:2013/07/04 13:02
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!