アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめまして。まだプログラミングを始めて間もない学生です。
現在Windowsプログラミングを学習しています。

学校で課題を出されたのですが、どうしても分からないので教えてください。

ある50MB程のテキストファイルがあります。それにはたくさんの個人情報が含まれており、
個人情報保護の観点から個人を特定できなくする必要があります。

そこで、以下のように8桁の患者IDを"*"(アスタリスク)に置換をしなければならないのですが、
その実現方法が分かりません。
・"<受信歴>患者ID:"に続く0バイト目から8バイトを"*"に置換する。
 例えば、「2005/01/01 09:00:00 <受診歴>患者ID:0000001234 内科受診」の行を
「2005/01/01 09:00:00 <受診歴>患者ID:********** 内科受診」とする必要があります。
ファイル内にはこのような該当箇所がたくさんあります。

簡単なウィンドウを作り、そこに配置したボタンを押下することによって指定ファイルが読み込まれ、
置換された新規ファイルが作成されるといった具合です。

ご教授の程、よろしくお願い致します。

<環境>
・OS:Windows2000
・開発環境:VC++ 6.0
・できればWin32APIを用いて。標準関数を用いてもよい。

A 回答 (12件中11~12件)

質問が「文字列置換のアルゴリズムを教えてください」で、


> 簡単なウィンドウを作り、そこに配置したボタンを押下することによって

とあるので、作成するのはGUIプログラムで
ファイルの作成手順は今回の質問の範囲にはないと思いますがいいですか?

とりあえず、「文字列置換」では有名なアルゴリズムは
なかったと思うので、力技でやるしかないでしょう。
ただし、置換対象を見つける段階において工夫する余地はあります。
ただ、高速な文字列検索アルゴリズムって
> "<受信歴>患者ID:"に続く
多バイト文字とは相性がよくなかったりするんですよね。

ということでとりあえず結果ガでりゃアいいだろうというレベルで
(工夫の余地はありますのでその辺はがんばってください)、

・読み込みのためにファイル1をオープンする
・書き込みのためのファイル2をオープンする
・ファイル1から一行読み込む
・読み込んだ行の中に、「<受信歴>患者ID:」
があるか検索する
→とりあえず strstr (もしくは_mbsstr)を使う
・みつからなかったらそのままファイル2に出力

・見つかった場合、
その直後がIDと見なせるものかチェックして、
もしIDらしいのなら'*'で行の内容を上書き。
・出力

でいいんじゃないですかね。
'*'で書き潰す前後でデータの長さが変わるわけじゃないので
単純に上書きでいいでしょう。

面倒なので細かい注意事項は書きませんが、
また引っかかるようならその辺補足ででても書いてください。
親切な誰かが事細かに説明してくれるかもしれませんけど。

この回答への補足

ご丁寧に回答してくださりありがとうございます。
完全には理解しきれていませんが、参考にさせていただき
なんとか完成させたいと思います。

ちなみになんですが、mallocやcalloc等を用いて、読み込むバッファの領域を確保する必要などはないのでしょうか?

基本的な質問ばかりですみませんが、ご回答頂けると幸いです。

補足日時:2007/06/25 13:13
    • good
    • 0

★アドバイス


・最初にファイルの入出力はどんな方法で行っていますか?
 C言語のランタイムライブラリの fopen、fclose 系ですか?
 それとも Win32 API の CreateFile、CloseHandle 系ですか?
 MFC は使っているの?
・あと CUI、GUI プログラムのどちらですか?
 CUI はコマンドプロンプトで実行するタイプです。
 GUI はウインドウが出るタイプです。
・以上。補足要求します。→下の『参考URL』もどうぞ。Win32 API でのファイル操作。

参考URL:http://wisdom.sakura.ne.jp/system/winapi/win32/w …

この回答への補足

早速のご回答ありがとうございます。
・現在、ファイル入出力はWin32APIのCreateFile、CloseHandleで行っています。
置換の部分がどうしても分らないので、ただ読み込んで、新規ファイルを作成し書き込みをするところまでしか至ってません。
C言語のランタイムライブラリを使用した方が効率が良いのであれば、そちらの使用も考えています。
MFCは使用しません。
・GUIプログラムです。といっても、ウィンドウに1つボタンがついているだけです。
処理の進行状況はメッセージボックスで表示するようにしています。
case WM_COMMAND:
switch(LOWORD(wp)){
case ID_BUTTON:
hFile = CreateFile(・・・・
といった具合です。
・重ねての質問で申し訳ないのですが、やはり50MB程度のファイルを読み込むときは、
GetFileSize→GlobalAlloc→GlobalLockと行った流れでは問題でしょうか?
MSDNによると、VirtualAllocを使用したほうが良いとのことですが、引数の設定の仕方などがあまりよく分らないもので・・・
・できれば、処理速度も考慮に入れたいです。

お手数お掛けしますが、ご教授の程よろしくお願い致します。

補足日時:2007/06/25 10:13
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!