• ベストアンサー
  • 困ってます

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

  • 質問No.5957388
  • 閲覧数758
  • ありがとう数19
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 100% (2/2)

置換で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行近いデータの集計を早急に出さなければならない状況に置かれており焦っています。

よろしくお願いします。

質問者が選んだベストアンサー

  • 回答No.2
  • ベストアンサー

ベストアンサー率 32% (21/65)

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

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

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

お礼率 100% (2/2)

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

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

ありがとうございました。
投稿日時:2010/06/10 10:27

その他の回答 (全1件)

  • 回答No.1

ベストアンサー率 55% (1857/3366)

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のもどす
}
お礼コメント
umuquzi

お礼率 100% (2/2)

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

丁寧なコメントもありがとうございます!
未来のために試してみます。
投稿日時:2010/06/10 10:30
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ