- ベストアンサー
コンマ区切りデータへの変換
------------------------- Name=清原 Age=36 野球選手です。 2000本安打を打ちました。 ハッピーです。 Name=桑田 Age=36 野球選手です。 投手です。清原の友達です。 Name=○○○ Age=△△ ×××××××××××× ×××××××××××。 ---------------------- といったデータ(各人のデータは "Name=" から始まる)を、 ---------------------- "清原",36,"野球選手です。\n2000本安打を打ちました。\nハッピーです。" "桑田",36,"野球選手です。\n投手です。\n清原の友達です。" "○○○",△△,"××××××××××\n×××××××××××××。" ---------------------- のような、コンマ区切りのデータに変えるには、 どうすれば良いでしょうか? シェル(bashなど)で可能でしょうか。 Perlなどで可能でしょうか? 私も、逆の変換なら awk で作ることができるのですが・・・。 ぜひ、アドバイスをよろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
アドバイスというより、回答に近いですが。。。 Perlでちゃちゃっと作ったものですので、本当はもっとスマートに記述できますが、そこら辺は工夫してみてください。 なお、「データの記述ミスはない」という前提で作ってますんで、ミスがあったらおしまいです。 ちなみに標準出力ですんで、ファイルに出力したい場合は、もう一工夫必要です。 あとは、解析してみてください。 $filename = "データファイル名"; $data_cnt = 0; $comment_cnt = 0; open(FILE,$filename) || die "Can't open $filename\n"; while(<FILE>) { tr/\r\n//d; if ( $_ =~ /^Name=(.*)/ ) { $comment_cnt = 0; if ( $data_cnt > 0 ) { print "\"\n"; } print "\"$1\","; $data_cnt++; } elsif ( $_ =~ /^Age=(.*)/ ) { print "$1,\""; } elsif ( $_ ) { if ( $comment_cnt > 0 ) { print "\\n"; } print $_; $comment_cnt++; } } close(FILE); if ( $data_cnt > 0 ) { print "\"\n"; } #データの変換で一時的に使う程度なら、こんなもんでしょう。 #日常的に使う場合は、もっと使い勝手も良いように、かつきれいに書きますが。(^_^;
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
UNIX系でVB系はだめでしょうが作って見ました。 エクセルが使える環境なら出来ます。 ツール-マクロ-VBE-挿入-標準モジュール で出る画面に下記を貼りつけ、メニューの「実行」。 Sub test01() Open "c:\My Documents\テストデータ1.txt" For Input As #1 Open "c:\My Documents\テストデータ2.txt" For Output As #2 s3 = "" rno = 0 '------ While Not EOF(1) Line Input #1, a rno = rno + 1 If Left(a, 5) = "Name=" Then If rno <> 1 Then Write #2, s1, s2, s3 s3 = "" End If s1 = Mid(a, 6, Len(a) - 5) ElseIf Left(a, 4) = "Age=" Then s2 = Val(Mid(a, 5, Len(a) - 4)) '数値化 Else s3 = s3 & a '文字列結合 End If Wend Write #2, s1, s2, s3 Close #1 Close #2 End Sub VBにはWrite#という、本題の形式のCSVファイルを作るに 適したステートメントがあります。(文字列に””、数値 はそのままのカンマ区切り) (テストデータ) Name=清原 Age=36 野球選手です。 2000本安打を打ちました。 ハッピーです。 Name=桑田 Age=36 野球選手です。 投手です。清原の友達です。 Name=山田 Age=26 会社員 パソコンでデータ整理担当。 横浜在住です。 (結果) "清原",36,"野球選手です。2000本安打を打ちました。ハッピーです。" "桑田",36,"野球選手です。投手です。清原の友達です。" "山田",26,"会社員パソコンでデータ整理担当。横浜在住です。"