Rubyでテキスト処理について教えてください

投稿日時:
» 5606
[5606]Rubyでテキスト処理について教えてください 投稿者:△ 投稿日:08/05/05-12:46
はじめまして。いろいろあってRubyを勉強することになりました。

やりたいことは、お客様からいただいたテキストデータ
(コードはライターさん次第)をユニコードにしたうえで、
数字を半角にしたり、パーレンを全角に整えたり…といった単純作業です。
(この二つなら別にJeditとかでも事足りるのですが、
仕事によっては、一桁のみ全角とか、二桁のみ半角にといったこともあるので…)

で、クロネコさんの記事(5546)とか
せうぞーさんの記事(ttp://www.seuzo.jp/rubbs/search_html/msg01621.html)とか
InDesiegn勉強部屋BBS保管庫の記事(9507)とかを参考に
hankaku.rbというものを作ってみました(内容は下記の通りで、
とりあえず全角半角の処理のみ記述してあります)が、
できあがりのテキストを開いてみると、処理前同様全角数字のままなのです。

---------------------------------------------
#! /usr/bin/ruby -Ku

require "jcode"
require "nkf"

# 読込ファイルと書込ファイルを開く
readFile = File.open(ARGV[0])
writeFile = File.open(ARGV[0] + "_new", "w")

# 文字列取得
readString = readFile.read

#文字コードと改行コード変換
readString = NKF.nkf("-w -Lu -m0", readString)

# 処理
readString.each { |line|
#全角数字>半角
line.tr!("0-9", "0-9")
writeFile.print(line)
}

# ファイルを閉じる
readFile.close
writeFile.close
---------------------------------------------

作業環境は、Mac OS X 10.5.2、Rubyのバージョンは1.8.6です。
それから、関係あるのかどうか、また参考になるかどうかもわかりませんが、
hankaku.rbはshift JISで改行はLF、
文字列のサンプルテキストはshift JISで改行はCRで作られていて、
処理後に出来た新しいテキストファイルはUTF-8で改行はLFになっています。


またこの話題かと自分でも思うのですが、ご指導よろしくお願いいたします。
» 5607
[5607]Re: Rubyでテキスト処理について教えてください 投稿者:せうぞー 投稿日:08/05/05-15:28
このスクリプトのままでも、全角→半角の動作はしました。
(たぶん)喰わせるテキストの量が少なくて(あるいはちゃんと読めなくて)自動判定に失敗してるとかなんじゃないでしょうか?
自動判定など、信用してはいけません。痛い目を見ます^^

自分で書いておいて言うのもなんですが、最初にメモリに読み込む必ませて自動判定なんていうのは、まったく馬鹿げています。こういうやり方が、広がるのは好ましいことだと思いません。わたしの場合は、(コンピュータの知識のない)ほんとうに素人さん相手だったので、仕方なかったのです。
それくらいは、自分のエディタで変換して、自分の目で確かめておくべきだと思います。普通の人はそれくらいはできるはずです。
miならば、2アクションで文字コードと改行コードまで変えることができます。あとは保存するだけ。

スクリプト中で気になったのは、イテレータの中で1行づつ書き込み処理をしているところです。
標準出力ではなく1行づつファイルアクセスをしているので、オーバーヘッドが大きいかと。

自動判定をやめてしまえば、正確だし、スクリプトも短くなります。
require "jcode"
while line = ARGF.gets
line.tr!("0-9A-Za-z", "0-9A-Za-z")#全角数字を半角に
print line
end

これだけになります。なんならワンライナーにもなります。あとはターミナルでリダイレクトするだけ。
» 5608
早速のレスありがとうございます。しかも有名なせうぞーさんから!

結局テキスト量増やしても、全角半角の動作は確認できず、
原因不明のままご指導いただいたソースを使わせていただきました。(汗
もう少し早くお礼のレスを書けるかと思っていたのですが、
何故か変換がうまくいかず、今に至っています。

具体的には、sampletext1というファイルに

「個々の引数ファイル毎の行番号を得るには ARGF.file.lineno とします。
たとえば10,000円の中古DSこれが5,000円に」

という二行の文字列が入っていて、miでUTF-8、LFにしてあります。
これを、hankaku2.rb (ソースは下の通りです)にかけて、
sampletext1_newというファイルに書き出しているのですが、
sampletext1_newの中身はUTF-8、LFで、

「個々の引数ファイル毎の行番号を得るには A4GF.zzzy.zzzyzz とします。
たとえば10,000円の中古DSこれが5,000円に」

というようになっています。

====hankaku2.rb=======================
#! /usr/bin/ruby -Ku
require "jcode"
while line = ARGF.gets
line.tr!("0-9A-Za-z", "0-9A-Za-z")#全角数字を半角に
print line
end
===================================

sampletext1をmiでshift JISにして、rubyの-Kuを-Ksにすると
全然問題なく変換してくれるので、迷宮入りの状態です。
私が根本的なところで大きな誤解をしている気がするのですが、
再度ご指導願えないでしょうか?
» 5610
[5610]Re^3: Rubyでテキスト処理について教えてください 投稿者:せうぞー 投稿日:08/05/06-22:47
遅くなってしまってすいません。

わたしのところでは、この2行だけでも正しく変換しています。
ターミナルでカレントディレクトリに入って、
$ruby hankaku2.rb sampletext1.txt > sampletext1_new.txt
ってな感じで、sampletext1_new.txtの中身は

個々の引数ファイル毎の行番号を得るには ARGF.file.lineno とします。
たとえば10,000円の中古DSこれが5,000円に

になっています。ロケールが違うかもしれない。
ちなみに、
$ ruby -Ku hankaku2.rb sampletext1.txt > sampletext1_new.txt
ではどうですか?
必要なら、環境変数RUBYOPTを書いて(追加して)おくといいかもしれません。
http://doruby.kbmj.com/saronpasu_on_rails/20080326/Ruby_1
http://www.ruby-lang.org/ja/man/html/_B4C4B6ADCAD1BFF4.html

P.S.
人違いなら申し訳ないのですが、△さんって、わたしの知り合いの△さんですか?
» 5613
> 遅くなってしまってすいません。
>
> わたしのところでは、この2行だけでも正しく変換しています。
> ターミナルでカレントディレクトリに入って、
> $ruby hankaku2.rb sampletext1.txt > sampletext1_new.txt
> ってな感じで、sampletext1_new.txtの中身は
>
> 個々の引数ファイル毎の行番号を得るには ARGF.file.lineno とします。
> たとえば10,000円の中古DSこれが5,000円に
>
> になっています。ロケールが違うかもしれない。
> ちなみに、
> $ ruby -Ku hankaku2.rb sampletext1.txt > sampletext1_new.txt
> ではどうですか?
> 必要なら、環境変数RUBYOPTを書いて(追加して)おくといいかもしれません。
> http://doruby.kbmj.com/saronpasu_on_rails/20080326/Ruby_1
> http://www.ruby-lang.org/ja/man/html/_B4C4B6ADCAD1BFF4.html
>
> P.S.
> 人違いなら申し訳ないのですが、△さんって、わたしの知り合いの△さんですか?
» 5614
遅レスもうしわけありません。
それから5613は操作ミスです(泣

レス遅さから予想されてるかもしれませんが、やはり結果は変わらずでした。
しかし、せうぞーさんの方で動作してるということなので、
私のマシンの環境まわりが原因かもしれません。
rubyのパス通した以外は特にいじってないのですが、
こっちのほうを少し見てみようと思います。

ご指導ありがとうございました^^

P.S.やっぱりバレました?(笑
» 5615
[5615]Re^6: Rubyでテキスト処理について教えてください 投稿者:せうぞー 投稿日:08/05/08-19:30
> レス遅さから予想されてるかもしれませんが、やはり結果は変わらずでした。

うーん、なんだろう?
miのモードの設定で、「リソースフォークを保存しない」にチェックしてみてください(スクリプトもテキストも)。ゴミが付いているのかもしれません。

> P.S.やっぱりバレました?(笑

やっぱり。
△くんは頑張っているなあ、と思いました。
っていうか、直接電話しないさいよ。他人のフリしてんじゃなくてさ^^
» 5616
またまた遅レス、すみませんです。

相変わらずでした。
その後、いろいろやってみたのですが、rubyのソースをUTF-8、LFにしてみたら、
UTF-8、LFのサンプルは思った通りの結果になりました。
が、UTF-8、LFのソースを使って、shift JISのサンプルテキストを使うと化けます。
まぁ、なんとか動作するというところにまではきましたが、
これだと文字コードごとに、rubyのソースが必要になってしまうので微妙でよね・・・。

> っていうか、直接電話しないさいよ。他人のフリしてんじゃなくてさ^^

長い間ご無沙汰していたので、かなり心の中で葛藤が・・・(汗
結局、お手数かけてしまい、申し訳ないやら恥ずかしいやらです。
ともあれ、なんとか動くところまできたのは、ご指導してもらったおかげです。
いろいろとありがとうございました^^
» 5709
> (この二つなら別にJeditとかでも事足りるのですが、
> 仕事によっては、一桁のみ全角とか、二桁のみ半角にといったこともあるので…)

今更だろうけど、これもJeditの公式ライブラリで普通に可能だよね。

このページをシェア