ab.com コミュニティ https://www.activebasic.com/forum/ |
|
文字列の置き換え https://www.activebasic.com/forum/viewtopic.php?t=2567 |
ページ 1 / 1 |
作成者: | 太郎 [ 2009年4月09日(木) 22:09 ] |
記事の件名: | 文字列の置き換え |
プログラムを始めて3ヶ月の初心者です。 ファイル(約100M)を読み込み、$Nameを探し"山田 太郎"に変換したいのですが、どうすすればよいのでしょう? ファイルサイズを調べ、メモリを確保しファイルを読み込むまではできたのですが、単純に文字列を置き換えると、バイト長が異なるので後ろの部分が壊れてしまします。 変換用に別メモリを確保し、コピーしながら変換していくのも、変換に必要なサイズを予測できません。 EditBoxをメモリ代わりにしてみましたがうまく行きませんでした。(容量制限?) また、工夫をしないと速度がとても遅くなると思います。 何か良い方法は有りませんか? |
作成者: | konisi [ 2009年4月10日(金) 00:10 ] |
記事の件名: | |
5分くらいの事路(SJISでエンコードされていると仮定すると)$Nameを"山田 太郎"に変換するとしたら5バイトが12バイトになる為、結果の最大長は元の2.4倍になります。 そこで以下のような手順が考えられます。 1. (ファイルサイズが100MBだとして)100MB確保し、ファイルを読み込む。 2. ファイルサイズの2.4倍にあたる240MBを確保する。 3. 以下のような奴を回す。 コード: '方法を説明するためのもの。実際に動かしてみたわけじゃないので正確に動くとは限らない。 'inbuf (As *Byte)は入力、outbuf(As *Byte)は出力。 i=0 j=0 Do k=InStr(i+1,MakeStr(inbuf),"$Name")-1 if k=0 then lstrcat(outbuf+j,inbuf+i) else memcpy(outbuf+j,inbuf+i,k-i) lstrcat(outbuf+j,Ex"\q山田 太郎\q") j=j+(k-i)+12'12=lstrlen(Ex"\q山田 太郎\q") i=k+5'5=lstrlen("$Name") end if Loop4. 必要ならファイルに書き込む。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |