• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:置換でcsv(tsv?)内の複数行のデータを1行にまとめたい。(超初心)

csv(tsv?)内の複数行のデータを1行にまとめる方法とは?

このQ&Aのポイント
  • 正規表現とperlを一週間くらい前から勉強し始めた超初心者です。htmlとcssを多少知っているレベルの人間です。
  • miというmacのテキストエディタにcsvのデータを貼付けてやっているのでたぶんタブ区切りのカタチでやっていることになるのではないかと思っています。
  • そこで、(.*?) (.*?) (.*?) (.*?)を使って3行ごとにヒットさせた結果を並べ替えようとしていますが、うまくいっていません。焦っています。

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

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

データの並びが保証されているのならば データ全体の中から改行+データイ|データロを削除すればいいのでは? s/\r?\n?(?:データイ|データロ)//g;とか。。。 こんなことならテキストエディタの方が楽の予感? あとは、地道に1行読んで1列目を削除して結合とかで十分だとおもいますよ。 @A1 = split(/,/, <>); @A2 = split(/,/, <>); shift @A2; @A3 = split(/,/, <>); shift @A3; print join(",", @A1, @A2, @A3) . "\n" とか

umuquzi
質問者

お礼

2、3行目の改行と1列目の文字を削除すればいいんですね。 確かに。。。 全然思いつきませんでした。 スキルアップがんばります。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

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
質問者

お礼

完全に並べ替えに心が奪われていました。 この方法だと一気にできてよさそうですね。 丁寧なコメントもありがとうございます! 未来のために試してみます。

すると、全ての回答が全文表示されます。

関連するQ&A