質問: 置換で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行近いデータの集計を早急に出さなければならない状況に置かれており焦っています。 よろしくお願いします。
回答: データの並びが保証されているのならば データ全体の中から改行+データイ|データロを削除すればいいのでは? s/\r?\n?(?:データイ|データロ)//g;とか。。。 こんなことならテキストエディタの方が楽の予感? あとは、地道に1行読んで1列目を削除して結合とかで十分だとおもいますよ。 @A1 = split(/,/, <>); @A2 = split(/,/, <>); shift @A2; @A3 = split(/,/, <>); shift @A3; print join(",", @A1, @A2, @A3) . "\n" とか