アプリ版:「スタンプのみでお礼する」機能のリリースについて

置換でcsv(tsv?)内の複数行のデータを1行にまとめたい。(超初心者です)

正規表現とperlを一週間くらい前から勉強し始めた超初心者です。htmlとcssを多少知っているレベルの人間です。

AAA,1,2,2
データイ,3,-1,0
データロ,1,0.25,8
BBB,1,2,2
データイ,3,-1,0
データロ,1,0.25,8
CCC,1,2,2
データイ,3,-1,0
データロ,1,0.25,8

のような3行一組のデータを

AAA,1,2,2,3,-1,0,1,0.25,8
BBB,1,2,2,3,-1,0,1,0.25,8
CCC,1,2,2,3,-1,0,1,0.25,8

のように一番上の行にまとめようとしています。

miというmacのテキストエディタにcsvのデータを貼付けてやっているのでたぶんタブ区切りのカタチでやっていることになるのではないかと思っています。

いろんなサイトの見よう見真似でやった結果、

(.*?)\t(.*?)\t(.*?)\t(.*?)
データイ\t([-]??d+(?.?d+)?)\t([-]??d+(?.?d+)?)\t[-]??d+(?.?d+)?
データロ\t([-]??d+(?.?d+)?)\t([-]??d+(?.?d+)?)\t[-]??d+(?.?d+)?

で3行ごとにヒットはするようになりましたが、並べ替えの仕方がよくわかりません。

[-]??d+(?.?d+)?

をそれぞれ( )で囲んで

$1\t$2\t$3\t$4\t$5\t$6\t$7\t$8\t$9\t$10\t$12

のようにやってみましたが、$6あたりから後がでてきませんでした。

たぶんかなりとんちんかんなことをやっている気がしているのですが、20000行近いデータの集計を早急に出さなければならない状況に置かれており焦っています。

よろしくお願いします。

A 回答 (2件)

データの並びが保証されているのならば


データ全体の中から改行+データイ|データロを削除すればいいのでは?
s/\r?\n?(?:データイ|データロ)//g;とか。。。

こんなことならテキストエディタの方が楽の予感?

あとは、地道に1行読んで1列目を削除して結合とかで十分だとおもいますよ。
@A1 = split(/,/, <>);
@A2 = split(/,/, <>); shift @A2;
@A3 = split(/,/, <>); shift @A3;
print join(",", @A1, @A2, @A3) . "\n"
とか
    • good
    • 0
この回答へのお礼

2、3行目の改行と1列目の文字を削除すればいいんですね。
確かに。。。

全然思いつきませんでした。
スキルアップがんばります。

ありがとうございました。

お礼日時:2010/06/10 10:27

csvと、miに貼り付けたからTSV、との関係がよくわからないのですが。



1行目はすべて
2,3行目は先頭1項目以外
を横につなげる、ということでよろしいですか?

並び変えよう、などと考えず、
・1行目、2行目の改行を削除
・2行目、3行目の第1項目を削除
と考えればよいのです。

例えば

#!/usr/bin/perl
#↑実際のに合わせる

$l = 0 ; #現在の行数-1
while(<>) {
s/[\r\n]*$// ; # 改行文字を削除。CR,LF,CRLFに対応
#if ( ! /,/ ) { next;} #余計な行の削除例:カンマの無い行はとばす
#if( ( $l == 0 ) && ! /^([^,]*,){3}[^,]*$/ )) {
#next;
#} #余計な行の削除例: データ開始行まで行数をカウントしない

if ( $l == 0 ) {
# 1行目 →そのまま
print ;
} else {
s/^[^,]*,/,/ ;#先頭2項目削除
print ;
#3行目なら改行
if ( $l == 2 ) { print "\n"}
}
$l ++ ;
if ( $l > 2 ) { $l = 0 ; } # 3行目では0のもどす
}
    • good
    • 0
この回答へのお礼

完全に並べ替えに心が奪われていました。
この方法だと一気にできてよさそうですね。

丁寧なコメントもありがとうございます!
未来のために試してみます。

お礼日時:2010/06/10 10:30

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