Rubyでテキスト処理について教えてください
投稿日時:
[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になっています。
またこの話題かと自分でも思うのですが、ご指導よろしくお願いいたします。
やりたいことは、お客様からいただいたテキストデータ
(コードはライターさん次第)をユニコードにしたうえで、
数字を半角にしたり、パーレンを全角に整えたり…といった単純作業です。
(この二つなら別に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
» 5608
» 5610
» 5613
» 5614
» 5615
» 5616
» 5709
[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
これだけになります。なんならワンライナーにもなります。あとはターミナルでリダイレクトするだけ。
(たぶん)喰わせるテキストの量が少なくて(あるいはちゃんと読めなくて)自動判定に失敗してるとかなんじゃないでしょうか?
自動判定など、信用してはいけません。痛い目を見ます^^
自分で書いておいて言うのもなんですが、最初にメモリに読み込む必ませて自動判定なんていうのは、まったく馬鹿げています。こういうやり方が、広がるのは好ましいことだと思いません。わたしの場合は、(コンピュータの知識のない)ほんとうに素人さん相手だったので、仕方なかったのです。
それくらいは、自分のエディタで変換して、自分の目で確かめておくべきだと思います。普通の人はそれくらいはできるはずです。
miならば、2アクションで文字コードと改行コードまで変えることができます。あとは保存するだけ。
スクリプト中で気になったのは、イテレータの中で1行づつ書き込み処理をしているところです。
標準出力ではなく1行づつファイルアクセスをしているので、オーバーヘッドが大きいかと。
自動判定をやめてしまえば、正確だし、スクリプトも短くなります。
require "jcode"
while line = ARGF.gets
line.tr!("0-9A-Za-z", "0-9A-Za-z")#全角数字を半角に
print line
end
これだけになります。なんならワンライナーにもなります。あとはターミナルでリダイレクトするだけ。
[5608]Re^2: Rubyでテキスト処理について教えてください 投稿者:△ 投稿日:08/05/06-12:17
早速のレスありがとうございます。しかも有名なせうぞーさんから!
結局テキスト量増やしても、全角半角の動作は確認できず、
原因不明のままご指導いただいたソースを使わせていただきました。(汗
もう少し早くお礼のレスを書けるかと思っていたのですが、
何故か変換がうまくいかず、今に至っています。
具体的には、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にすると
全然問題なく変換してくれるので、迷宮入りの状態です。
私が根本的なところで大きな誤解をしている気がするのですが、
再度ご指導願えないでしょうか?
結局テキスト量増やしても、全角半角の動作は確認できず、
原因不明のままご指導いただいたソースを使わせていただきました。(汗
もう少し早くお礼のレスを書けるかと思っていたのですが、
何故か変換がうまくいかず、今に至っています。
具体的には、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]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.
人違いなら申し訳ないのですが、△さんって、わたしの知り合いの△さんですか?
わたしのところでは、この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]Re^4: Rubyでテキスト処理について教えてください 投稿者:△ 投稿日:08/05/08-09:03
> 遅くなってしまってすいません。
>
> わたしのところでは、この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.
> 人違いなら申し訳ないのですが、△さんって、わたしの知り合いの△さんですか?
>
> わたしのところでは、この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]Re^5: Rubyでテキスト処理について教えてください 投稿者:△ 投稿日:08/05/08-13:00
遅レスもうしわけありません。
それから5613は操作ミスです(泣
レス遅さから予想されてるかもしれませんが、やはり結果は変わらずでした。
しかし、せうぞーさんの方で動作してるということなので、
私のマシンの環境まわりが原因かもしれません。
rubyのパス通した以外は特にいじってないのですが、
こっちのほうを少し見てみようと思います。
ご指導ありがとうございました^^
P.S.やっぱりバレました?(笑
それから5613は操作ミスです(泣
レス遅さから予想されてるかもしれませんが、やはり結果は変わらずでした。
しかし、せうぞーさんの方で動作してるということなので、
私のマシンの環境まわりが原因かもしれません。
rubyのパス通した以外は特にいじってないのですが、
こっちのほうを少し見てみようと思います。
ご指導ありがとうございました^^
P.S.やっぱりバレました?(笑
[5615]Re^6: Rubyでテキスト処理について教えてください 投稿者:せうぞー 投稿日:08/05/08-19:30
> レス遅さから予想されてるかもしれませんが、やはり結果は変わらずでした。
うーん、なんだろう?
miのモードの設定で、「リソースフォークを保存しない」にチェックしてみてください(スクリプトもテキストも)。ゴミが付いているのかもしれません。
> P.S.やっぱりバレました?(笑
やっぱり。
△くんは頑張っているなあ、と思いました。
っていうか、直接電話しないさいよ。他人のフリしてんじゃなくてさ^^
うーん、なんだろう?
miのモードの設定で、「リソースフォークを保存しない」にチェックしてみてください(スクリプトもテキストも)。ゴミが付いているのかもしれません。
> P.S.やっぱりバレました?(笑
やっぱり。
△くんは頑張っているなあ、と思いました。
っていうか、直接電話しないさいよ。他人のフリしてんじゃなくてさ^^
[5616]Re^7: Rubyでテキスト処理について教えてください 投稿者:△ 投稿日:08/05/10-13:07
またまた遅レス、すみませんです。
相変わらずでした。
その後、いろいろやってみたのですが、rubyのソースをUTF-8、LFにしてみたら、
UTF-8、LFのサンプルは思った通りの結果になりました。
が、UTF-8、LFのソースを使って、shift JISのサンプルテキストを使うと化けます。
まぁ、なんとか動作するというところにまではきましたが、
これだと文字コードごとに、rubyのソースが必要になってしまうので微妙でよね・・・。
> っていうか、直接電話しないさいよ。他人のフリしてんじゃなくてさ^^
長い間ご無沙汰していたので、かなり心の中で葛藤が・・・(汗
結局、お手数かけてしまい、申し訳ないやら恥ずかしいやらです。
ともあれ、なんとか動くところまできたのは、ご指導してもらったおかげです。
いろいろとありがとうございました^^
相変わらずでした。
その後、いろいろやってみたのですが、rubyのソースをUTF-8、LFにしてみたら、
UTF-8、LFのサンプルは思った通りの結果になりました。
が、UTF-8、LFのソースを使って、shift JISのサンプルテキストを使うと化けます。
まぁ、なんとか動作するというところにまではきましたが、
これだと文字コードごとに、rubyのソースが必要になってしまうので微妙でよね・・・。
> っていうか、直接電話しないさいよ。他人のフリしてんじゃなくてさ^^
長い間ご無沙汰していたので、かなり心の中で葛藤が・・・(汗
結局、お手数かけてしまい、申し訳ないやら恥ずかしいやらです。
ともあれ、なんとか動くところまできたのは、ご指導してもらったおかげです。
いろいろとありがとうございました^^
[5709]Re: Rubyでテキスト処理について教えてください 投稿者:ball 投稿日:08/06/05-16:46
> (この二つなら別にJeditとかでも事足りるのですが、
> 仕事によっては、一桁のみ全角とか、二桁のみ半角にといったこともあるので…)
今更だろうけど、これもJeditの公式ライブラリで普通に可能だよね。
> 仕事によっては、一桁のみ全角とか、二桁のみ半角にといったこともあるので…)
今更だろうけど、これもJeditの公式ライブラリで普通に可能だよね。