作業メモ:テキスト処理3 06/01
サンプルテキストの内容:
2998¥t文字列¥tHOGE¥t¥t1,800,000¥tA
コメント1行目¥t¥t¥t¥t¥t
コメント2行目¥t¥t¥t¥t¥t
2999¥tfoo¥tbar¥t文字列¥t157,500¥tB
3000¥t♂¥t♀¥t¥t105,000¥tW
3001¥t3,000¥t4,000¥t5,000¥t200¥tW
1レコードあたり6フィールドのデータで、第4フィールドについては空のレコードもある。
また、今回もコメント行がある。
コメント行は第1フィールドのみにデータが入力されており、他の5つのフィールドは空である。
今回施したい処理は以下の通り。
フィールド内のデータは左から順に
1[data]2[data]3[data]4[data]5[data]data
という形に囲み、フィールドセパレータのタブは削除。
なお、第6フィールドはブラケットで囲まない。
コメント行は、
%[data]%
という形に前後を囲みたい。
そしてさらに。
第1フィールドと第5フィールドの全角数字を漢数字、桁区切りの全角カンマを読点に置換したい。
このとき、千・百・十などの漢数字の挿入は不要。
とりあえず、書いたrubyスクリプトはこれ。
置換はできたんだけど……。
require "jcode"
def num2kan(kan)
kan.tr!("0123456789,", "〇一二三四五六七八九、")
return kan
end
while line = ARGF.gets
line.gsub!(/([0-9,]{2,}¥t)/) {num2kan($1)}
line.sub!(/^([^¥t]+)¥t([^¥t]*)¥t([^¥t]*)¥t([^¥t]*)¥t([^¥t]*)¥t([^¥t¥r¥n]+)/) {"1[#{$1}]2[#{$2}]3[#{$3}]4[#{$4}]5[#{$5}]#{$6}"}
line.sub!(/^([^¥t]+)¥t+$/) {"%[#{$1}]%"}
print line
end
実際に仕事で使うテキストには第1と第5フィールド以外、全角数字+全角カンマだけの組合せで入力されているフィールドがないことはわかっているのだが、サンプルテキストには試しに第2〜第4フィールドにも全角数字+全角カンマだけの組合せの文字列を入れてみたのだ。
結果は、当然というか、全てのフィールドについて全角数字+全角カンマだけの組合せのフィールドがあった場合、漢数字に変換されてしまう。
むー。別に汎用性を求めるようなスクリプトじゃないんだから、これでいいといえばいいんだけど、、、ぶつぶつ。
前回も、タブで分けて配列に入れるやり方を教わったばかりでしたね^^;
学習能力のない、デキの悪い生徒ですみません……。
今後とも、よろしくご指導のほど。
#!/usr/bin/ruby -Ks
require "jcode"
def num2kan(num)
num.gsub(/([0-9,]{2,})/) {$1.tr("0-9,", "〇一二三四五六七八九、")}
end
while line = ARGF.gets
line.sub!(/^([^\t]+)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t\r\n]+)/) {"1[#{num2kan($1)}]2[#{$2}]3[#{$3}]4[#{$4}]5[#{num2kan($5)}]#{$6}"}
line.sub!(/^([^\t]+)\t+$/) {"%[#{$1}]%"}
print line
end
私のコードはよく分からないで書いている部分も多いので参考程度にしてもらえたらと思います。
また、最初のコメントのやつは重複が多かったので少し直しました。
#!/usr/bin/ruby -Ks
require "jcode"
class Object
def to_kan!
self && self.gsub!(/([0-9,]{2,})/) {$1.tr("0-9,", "〇一二三四五六七八九、")}
end
end
while ARGF.gets
a = $_.chop.split("\t")
if a[1..5].empty?
printf("%[%s]%\n", *a)
else
a[0].to_kan!
a[4].to_kan!
printf("1[%s]2[%s]3[%s]4[%s]5[%s]%s\n", *a)
end
end
とんでもございません。教科書にさせていただきます(笑)
>> 重複
あ、なるほど!
ありがとうございました。
コメントの投稿
トラックバック
http://kstation2.blog10.fc2.com/tb.php/40-39c612f9











#!/usr/bin/ruby -Ks
require "jcode"
def num2kan(num)
num.tr("0-9,", "〇一二三四五六七八九、")
end
while ARGF.gets
a = $_.chop.split("\t")
if a[1..5].empty?
puts "%[#{a[0]}]%"
else
a[0] && a[0].gsub!(/([0-9,]{2,})/){num2kan($1)}
a[4] && a[4].gsub!(/([0-9,]{2,})/){num2kan($1)}
puts "1[#{a[0]}]2[#{a[1]}]3[#{a[2]}]4[#{a[3]}]5[#{a[4]}]#{a[5]}"
end
end