[#49148] Ruby 1.9で、バイト長の部分文字列を作りたくて悩んでます — Daisuke Yokotsuka <yokots_d@...3-net.ne.jp>

はじめまして。横塚と申します。

16 messages 2013/01/29

[ruby-list:49148] Ruby 1.9で、バイト長の部分文字列を作りたくて悩んでます

From: Daisuke Yokotsuka <yokots_d@...3-net.ne.jp>
Date: 2013-01-29 09:35:44 UTC
List: ruby-list #49148
はじめまして。横塚と申します。
昨年の11月からRubyの勉強を始めた新参者です。
よろしく、お願い致します。

題名の通り、Ruby 1.9で、バイト長の部分文字列を作りたくて悩んでます。
どなたか、良い知恵が有りましたら、ご教示下さいませ。

もし、このMLはそのような場では無いということでしたら、申し訳ありません。
読み捨てて下さい。

さて、やりたいことは、SJIS漢字とASCIIの混在した文字列から、
先頭の72バイトを抜き出したいということです。

target = data[0,72] ; 

では、72バイトではなく、72文字が転送されてしまうので、もちろんダメでした。

最初に書いたコードは

target = "" ; 
for i in 0..71 do 
	target = target + data.getbyte(i).chr ; 
end

なのですが、一旦getbyteしてしまうと、それを連結したものもASCIIと強制的に看做され、
その後にtargetに対して、SJISコードの正規表現を使うと
incompatible encoding regexp match (Windows-31J regexp with ASCII-8BIT string)
というエラーになってしまいます。

次に

target = "" ; 
for i in 0..data.size-1 do 
	if target.bytesize >= 72 then 
		break ; 
	end 
	target = target + data[i,1] ; 
end 

というコードを書いてみたのですが、なにせ遅い。
このコードを10万回回したら、5秒以上も掛かってしまいました。

少しでも早くしようと、間違いなく72バイトに収まっている文字は先に一気に代入しようと

num_of_kanji = data.bytesize - data.size ; 
minmum_length = 72 - num_of_kanji ; 
target = data[0, minmum_length] ; 
for i in minmum_length..71 do
	if target.bytesize >= 72 then 
		break ; 
	end 
	target = target + data[i,1] 
end 

というコードを書いて、10万回のループが0.2秒くらいにはなったのですが、
いかんせん、コードが汚い。

どなたか、もっと綺麗なコードで出来るというお知恵をお貸し下さいませ。
よろしくお願い致します。

--
Daisuke Yokotsuka

--
Daisuke Yokotsuka

In This Thread

Prev Next