UTF-8文字を高速でiniファイルに書き込むNo.10046
おすぎ さん 23/01/05 13:21
 
お世話になっております。

10万行のデータ(UTF-8)を処理してiniファイルに書き込むことを、高速で行おうとし
ています。

データをADODB.Streamオブジェクトに読み込み、
1行ずつメモリに取り出して処理した後、
ADODB.Streamオブジェクトに読み込み、
iniファイルに書き込もうとしています。

ですが、writeinistr コマンドとの兼ね合いが分からなくて頓挫しています。

もともとの発想が間違っているのでしょうか?

[ ]
RE:10046 UTF-8文字を高速でiniファイルにNo.10047
秀丸担当 さん 23/01/06 10:13
 
writeinistr/writeinistrwは、1つの呼び出しにつき毎回ファイル名、セクション名、
キー名を指定するので、少ないデータなら問題ないですですが、大量のデータを高速
にする目的には合わないかもしれないです。

別の方法で、iniファイル形式に準じたファイルとして書き出したほうがよさそうです。
iniファイル形式は、日本語環境ならShift-JISか、Unicode(UTF-16)(BOMあり)のどち
らかになります。
UTF-8はできないはずです。
(読み込み側も自前で処理するとしたらUTF-8でも不可能ではないですが)

簡単には、秀丸エディタで10万行のファイルを開いて、INIファイルに合う形に加工
して、saveasするのがいいです。
置換で加工する場合は、replaceallquickが速いです。

従来のマクロに慣れていればそっちのほうがいいかもしれないですが、V9.19以降で
はJavaScriptが使えるようになりました。
高速目的の場合、JavaScriptのほうがいい場合があります。
COMオブジェクトも秀丸マクロの文法に書き直すことなくそのまま扱え、高速かつ簡
単にできるようになると思います。
例えば、マクロが以下のようなものだとします。

$file="C:\\Folder\\test.ini";
#adodb=createobject("ADODB.Stream");
setpropstr #adodb, "Charset", "UTF-16";//, "UTF-8";
member #adodb, "Open";
member #adodb, "WriteText", "[AAA]\r\nabc=def\r\n[XXX]\r\nxyz=123\r\n", 0;
member #adodb, "SaveToFile", $file, 2;
member #adodb, "Close";
message getinistrw($file,"AAA","abc");
endmacro;


JavaScriptだと、以下のようになります。
(・・・というか、たぶんJavaScriptのほうが元で、今まで秀丸マクロの文法に書き
直していたものを、元に戻すことになる)

$file="C:\\Folder\\test.ini";
js{
  file=hidemaru.getVar("$file");
  adodb=createobject("ADODB.Stream");
  adodb.Charset ="UTF-16";//"UTF-8";
  adodb.Open();
  adodb.WriteText( "[AAA]\r\nabc=def\r\n[XXX]\r\nxyz=123\r\n", 0 );
  adodb.SaveToFile( file, 2 );
  adodb.Close();
}
message getinistrw($file,"XXX","xyz");
endmacro;

10万行の解析というのがどのようなものかわからないですが、読み込み側もJavaScri
ptにすると高速になるかもしれません。
読み込みは、hidemaru.loadTextFileを使うと形式を意識せずに簡単に変数上に読み
込めます。(ただし10MBまで)
js{
  utf8contents=hidemaru.loadTextFile("C:\\Folder\\utf8file.txt");
  a=utf8contents.split("\r\n");
  message(a[0]);
  message(a[1]);
  message(a[2]);
}
hidemaru.saveTextFileというメソッドは無いので、あったほうがよさそうです。今
後検討します。
UTF-16ならFileSystemObjectでもできると思います。

[ ]
RE:10047 UTF-8文字を高速でiniファイルにNo.10048
おすぎ さん 23/01/06 11:35
 
秀丸担当さま

詳細なご説明をありがとうございます。

JavaScriptがそのまま使えるんですね。さっそく勉強しようと思います。COMオ
ブジェクトの場合、オブジェクト以外の関数などは使えなかったので、
JavaScriptがそのまま使えることに期待したいです。

私は、iniファイルにUTF-8で書き込むために、元データの読み込みにもADODB.
Streamオブジェクトを使おうとしています。確かに、FileSystemObjetを使うと
文字化けします。

一つ教えてください。
「iniファイル形式はUTF-8はできないはずです」とありますが、普段、UTF-8フ
ァイルで作業していてiniファイルを使っても、文字化けしません。iniファイル
のANSI形式がUTF-8に対応しているのでしょうか?

[ ]
RE:10048 UTF-8文字を高速でiniファイルにNo.10049
秀丸担当 さん 23/01/06 15:12
 
iniファイルは、ずっと昔からあるWindows APIを通じて読み込む限りでは、UTF-8は
文字化けしてしまうと思います。
もし内容がASCII文字(普通の英数字)に限定されるのであれば、BOM無しUTF-8とShi
ft-JISの違いは全く区別が無いので、問題ないです。
それかiniファイルの読み込み側がWindows APIを通じたものではなく、独自に見てい
るものであれば、大丈夫なことがあるかもしれません。
秀丸エディタのgetinistr/getinistrwについては、Windows APIを通じたものなので、
ASCII文字以外は文字化けしてしまいます。

[ ]
RE:10049 UTF-8文字を高速でiniファイルにNo.10050
おすぎ さん 23/01/06 16:25
 
>秀丸エディタのgetinistr/getinistrwについては、Windows APIを通じたものなので、
>ASCII文字以外は文字化けしてしまいます。

そうですか。
ありがとうございました。

[ ]