コードから日本語を抽出

解決


ヒメッチ  2008-12-03 11:43:13  No: 140961  IP: 192.*.*.*

はじめましてヒメッチです。
ある標準EXEの中にあるフォームと標準モジュールの中にある
コードの中の日本語(コメントを除く)を抽出してEXCELファイルに羅列させていくんですが、どうやればいいでしょうか??
VBにほとんど触れたことがなくて。。
どなたか助けてください。

ある一例を出します。

ErrMsg("取得できません");

ErrMsg("禁止(Errcode="str$(inst) & ")")

の場合 "禁止"と"取得できません"を取り除いて
EXCELファイルに羅列したいと思っています。

編集 削除
魔界の仮面弁士  2008-12-03 13:58:55  No: 140962  IP: 192.*.*.*

wankuma とのマルチポストに思えましたが、別の関係者の発言に
見えなくも無いので、あちらの質問はとりあえず置いといて:
http://bbs.wankuma.com/index.cgi?mode=al2&namber=29026

> どうやればいいでしょうか??
そもそも何故、そのような作業が必要になっているのかを説明した方が
また別の解決策(あるいは無理かどうかの判定)が得やすいかと。


> ある標準EXEの
標準EXEプロジェクトのソースコードですか?
それとも、コンパイルされたEXEですか?

ソースだとしたら、地道に文字列解析するしか無いと思います。
EXE だとしたら、バイナリエディタで閲覧できる程度の情報しか
抜き出せないでしょう。

# かつて独語圏で、VB 製の EXE をソースコードに戻す
# 逆コンパイラを見た事がありましたが、今は見当たらず。


> 日本語(コメントを除く)を抽出して
> "禁止"と"取得できません"を取り除いて
それぞれ、逆の事を指しているように見えますが……。

結局のところ、取得したいのは「日本語部分」なのでしょうか?
それとも、「日本語以外の部分」を取得したいのでしょうか?

編集 削除
ヒメッチ  2008-12-03 14:42:25  No: 140963  IP: 192.*.*.*

>>そもそも何故、そのような作業が必要になっているのかを
全て英語で統一させる為です。
>>標準EXEプロジェクトのソースコードですか?
>>それとも、コンパイルされたEXEですか?
前者です。フォームとか標準モジュールとかありますよね。
その中のソースコードです。
>>結局のところ、取得したいのは「日本語部分」なのでしょうか?
>>それとも、「日本語以外の部分」を取得したいのでしょうか?
取得したいのは日本語部分です。

ではフォームと標準モジュールあわせて30ぐらいのファイルがあるんですけど
標準モジュールの中に適当に一つモジュールを作って,
ファイル全てに対して地道に文字列操作をしなければならないとそういう訳ですか??

編集 削除
ガッ  2008-12-04 00:20:07  No: 140964  IP: 192.*.*.*

> ではフォームと標準モジュールあわせて30ぐらいのファイルがあるんですけど
> 標準モジュールの中に適当に一つモジュールを作って,
> ファイル全てに対して地道に文字列操作をしなければならないとそういう訳ですか??
そういうわけです。
文字列操作ではなく正規表現エンジンを使えば多少楽になるかもしれませんが。
一応google検索結果もはっつけておきます:
http://www.google.co.jp/search?complete=1&hl=ja&q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%80%80%E6%97%A5%E6%9C%AC%E8%AA%9E&lr=

# ところで"おはようございます. 今日は 4日(木)です."なんて時は
# どこまで日本語なんだろうか…

編集 削除
じぇい  2008-12-04 07:51:18  No: 140965  IP: 192.*.*.*

なんか、やりたいことと、それを実現しようとしている方法に、ズレがあるように思うぞな。
「表示対象になるような文字列がある、ファイル名と行番号、ついでにその文字列を抽出する」んでないかい?

編集 削除
ヒメッチ  2008-12-04 13:22:53  No: 140966  IP: 192.*.*.*

>>「表示対象になるような文字列がある、ファイル名と行番号、ついでにその文字列を抽出する」んでないかい?

ごめんなさいじぇいさん何をいってるか分かりましぇン。。
>>"おはようございます. 今日は 4日(木)です."
全部日本語じゃないですか。
句読点も立派な日本語ですよ。

編集 削除
フェ  2008-12-04 13:41:09  No: 140967  IP: 192.*.*.*

>>全部日本語じゃないですか。
数字・記号は?
日本語でも英語でも、文字列の中に含まれる可能性はありますよね。
今回は無いいことが分かっているというなら構いませんが。

>>の場合 "禁止"と"取得できません"を取り除いて
取り除くのではなく抽出するんですよね?
取り除くと
ErrMsg("");
ErrMsg("(Errcode="str$(inst) & ")")
になってしまいますよ。

>>じぇいさん
ボリュームと内容によっては、Excelに出力したものを元に端から検索して直していくという強引な手法もできるかと。
じぇいさんのおっしゃるようにした方が断然楽だと思いますが。

編集 削除
ヒメッチ  2008-12-04 14:02:40  No: 140968  IP: 192.*.*.*

すいません。
コードで示していただけるうれしいのですが......。

編集 削除
だから  2008-12-04 14:09:57  No: 140969  IP: 192.*.*.*

なにが日本語になるのでしょうか?

「おはようございます. 今日は 4日(木)です.」
のなかの 「(」は日本語で
「ErrMsg("禁止(Errcode="str$(inst) & ")")」
のなかの「(」は日本語ではない?


>コードで示していただけるうれしいのですが......。
掲示板の使い方読んだほうがいいよ。

編集 削除
ヒメッチ  2008-12-04 14:17:28  No: 140970  IP: 192.*.*.*

カッコとか.とかは今思えば抽出する必要はないや。
>>掲示板の使い方読んだほうがいいよ。
どういう意味??

説明だと分かりにくいので示してほしいと申してるだけで...
別に無理して出してくださいとはいってないんだけど。。。

もし出せたらっていってるだけだから。

編集 削除
だったら  2008-12-04 14:22:19  No: 140971  IP: 192.*.*.*

「おはようございます. 今日は 4日(木)です.」

Excelにはどのように表示されるの?

おはようございます今日は日木です

か、それとも

おはようございます
今日は


です

のどっちか。

マルチポスト先でも提案が出ているが、grepツールを使ってやったほうがよいのでは?

編集 削除
ヒメッチ  2008-12-04 14:25:05  No: 140972  IP: 192.*.*.*

前者だと思うけど........

編集 削除
フェ  2008-12-04 14:33:42  No: 140973  IP: 192.*.*.*

>>カッコとか.とかは今思えば抽出する必要はないや。
とりあえず、本当にやりたい(やらなければいけない)ことを整理してみて下さい。

>>どういう意味??
コード書けっていうのはマナー違反です。
自分の仕事をやってくれって言ってるのと同じですよ。

目的・手段を明確にした上で調べて、「どこが」わからないかを伝えて聞くようにしましょう。

# 全部分からないというのは問題外です。

編集 削除
魔界の仮面弁士  2008-12-04 15:01:14  No: 140974  IP: 192.*.*.*

>> そもそも何故、そのような作業が必要になっているのかを
> 全て英語で統一させる為です。
その「全て英語で統一させる作業」が必要になっている理由は何でしょうか?
(OS が英語版とか、あるいは、VB6 が英語版とか?)

理由如何では、他にも確認すべき作業があるかも知れませんので…。
他言語版 OS で動作させる場合、たとえば、StrConv 中の第2, 第3引数の
見直しが必要になる場合もありますよ。


> その中のソースコードです。
例えば、
  MsgBox "弁士"
は NG だけど、
  MsgBox ChrW(&H5F01) & ChrW(&H58EB)
ならば OK 、という認識で良いのでしょうか。

あるいは、リソース内などに複数言語が含まれていて、それを
  Label1.Caption = LoadResString(I + 100)
などと呼びだしている場合はどうされるのでしょうか。


>>>"おはようございます. 今日は 4日(木)です."
> 全部日本語じゃないですか。

本当に『全部』ですか?

「.」だけではなく、
「.」も日本語と看做すのですか?
「()」だけではなく、
「()」も日本語と看做すのですか?

先の話では、
>>>>>  ErrMsg("禁止(Errcode="str$(inst) & ")")
に対して、「禁止」「取得できません」だけが対象だと書かれていたので、
「(」や「)」は日本語と看做さないのだと予想していたのですが…。


そうすると例えば、"2008/12/04" も日本語ですか?  
dt = CDate("H20/12/04") はどうでしょう?

日付の書式は、コントロールパネルの地域設定を見ると、
  米国では「12/4/2008」
  英国では「04/12/2008」
になっていて、いずれも "2008/12/04" 形式では無いようですけれども。


> コードで示していただけるうれしいのですが......。
ごめんなさいヒメッチさん何を知りたいのか見えてきません。
まずは、今回のヒメッチさんのシステム仕様における「日本語」の定義を教えてください。

仕様が曖昧な状態で、サンプルコードを求められても、提示しようが無いですし…。

編集 削除
魔界の仮面弁士  2008-12-04 15:41:39  No: 140975  IP: 192.*.*.*

とりあえず、最後の Excel 出力という部分については、
  http://hanatyan.sakura.ne.jp/vbhlp/excelframe.htm
が参考になるかと思います(VB6から出力する場合)。

ただし、最終的な出力ターゲットが Excel なのであれば、
ソースファイルの解析処理自体を Excel VBA で組んだ方が
てっとり早いかと。

言語仕様だけ見れば、Excel VBA と VB6 は殆ど同じなのですが、
外部(VB6)から Excel を操作するよりは、Excel VBA にて
Excel自身を操作させた方が効率が良いので。

編集 削除
やじゅ  2008-12-04 16:06:48  No: 140976  IP: 192.*.*.*

とりあえず、簡易的な仕様だけとらえれば

ソースの一行ごとに対して、正規表現で半角のみ『^[ -~。-゜]*$』か
どうか判断して、半角のみでは無ければ全角文字が含まれているって
ことで、Excelに吐き出すってな感じです。

grepツールで、-vオプションを付ければ、正規表現の反転結果が
出来るので、その結果を踏まえて、どうするのか判断すると
いいんじゃないかな。

まずはプログラム作成よりはツールで試してみてはいかがでしょう

編集 削除
YuO  2008-12-04 16:54:26  No: 140977  IP: 192.*.*.*

> ソースの一行ごとに対して、正規表現で半角のみ『^[ -~。-゜]*$』か
> どうか判断して、半角のみでは無ければ全角文字が含まれているって
> ことで、Excelに吐き出すってな感じです。

ではダメだということだそうです。

>>> おはようございます. 今日は 4日(木)です.

には,いわゆる半角文字である,
・U+0020 SPACE  
・U+0028 LEFT PARENTHESIS (
・U+0029 RIGHT PARENTHESIS )
・U+002E FULL STOP .
・U+0034 DIGIT FOUR 4
が含まれているからです。


個人的には,文字定数部分を全部取り出して,日本語かどうかは目視確認したら,とか思うのですが。
# 「日本語」とは何か,定義できていないようですし。

編集 削除
ヒメッチ  2008-12-04 17:10:07  No: 140978  IP: 192.*.*.*

返信どうもです。
定義かどうか微妙ですが、英語に翻訳可能なものですね☆
だから明らかに句読点とか(ははっきりいって入りません。。

編集 削除
ヒメッチ  2008-12-04 17:10:08  No: 140979  IP: 192.*.*.*

返信どうもです。
定義かどうか微妙ですが、英語に翻訳可能なものですね☆
だから明らかに句読点とか(ははっきりいって入りません。。

編集 削除
我龍院  2008-12-04 17:22:14  No: 140980  IP: 192.*.*.*

英語版のVB6に日本語のコードを貼り付けてみたらどうなのかな。
エラーと???の部分を直して行けば良いような。
確認の為に最後には英語版が必要となるはずだから。

編集 削除
フェ  2008-12-04 17:24:19  No: 140981  IP: 192.*.*.*

Excelの出力は一度CSVで出して保存し直した方が楽なのでは?
仕様の関係で無理な場合もあるでしょうけど。

編集 削除
YuO  2008-12-04 18:38:16  No: 140982  IP: 192.*.*.*

> 定義かどうか微妙ですが、英語に翻訳可能なものですね☆

それは定義ではありません。
それを定義として扱うためには,「英語に翻訳可能なもの」とは何かを定義する必要があります。
人間が処理するのではなく,コンピュータが処理する,という前提がある以上,曖昧な定義は許されません。
# つまり,「私が思う日本語を処理したい」は通用しない,ということです。

今回の場合における「日本語」の定義が厳密にできないのであれば,
先も書いたように,文字列定数を全て取り出して,目視するしかないと思うのですが。
# 『Unicode 5.1.0のこの範囲を今回の処理における「日本語」と定める』,というようなことをすれば,厳密な定義になります。

編集 削除
じぇい  2008-12-04 22:45:06  No: 140983  IP: 192.*.*.*

> >>「表示対象になるような文字列がある、ファイル名と行番号、ついでにその文字列を抽出する」んでないかい?

> ごめんなさいじぇいさん何をいってるか分かりましぇン。。

ぱすぽーとをみせなさい
なまえは?
どこからきた?
もくてきは?

スターアーサーネタは通じる?
それはともかく、目的。

> 全て英語で統一させる為です。
なぜそんなことをする必要が生じたのか。
何を英語で統一するのでしょう?
そして、日本語を取り去ってしまったら、何を入れていいかわからなくなりますよね。
だから、「ここ(ファイル名と行番号)には、こんな文字列が使われている」ということがわかるような出力をした方がいいのではないか、という提案です。

実際に英語版のOSに英語版のVisualStudioを入れてコンパイルさせるなら、コメントの日本語も取り払う必要がありました。

編集 削除
いみふ  2008-12-05 01:04:50  No: 140984  IP: 192.*.*.*

http://okwave.jp/qa4524134.html
>VBじゃなきゃだめなんですよね☆
だって。

>その中に標準モジュールを試験的に一つ作ってその中で
>命令させるとかって出来ますか??
意味不明w

編集 削除
ヒメッチ  2008-12-05 08:34:49  No: 140985  IP: 192.*.*.*

解決しました。
助かりました

編集 削除