はじめまして。まだプログラミングを始めて間もない学生です。
現在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を用いて。標準関数を用いてもよい。
No.2
- 回答日時:
質問が「文字列置換のアルゴリズムを教えてください」で、
> 簡単なウィンドウを作り、そこに配置したボタンを押下することによって
とあるので、作成するのはGUIプログラムで
ファイルの作成手順は今回の質問の範囲にはないと思いますがいいですか?
とりあえず、「文字列置換」では有名なアルゴリズムは
なかったと思うので、力技でやるしかないでしょう。
ただし、置換対象を見つける段階において工夫する余地はあります。
ただ、高速な文字列検索アルゴリズムって
> "<受信歴>患者ID:"に続く
多バイト文字とは相性がよくなかったりするんですよね。
ということでとりあえず結果ガでりゃアいいだろうというレベルで
(工夫の余地はありますのでその辺はがんばってください)、
・読み込みのためにファイル1をオープンする
・書き込みのためのファイル2をオープンする
・ファイル1から一行読み込む
・読み込んだ行の中に、「<受信歴>患者ID:」
があるか検索する
→とりあえず strstr (もしくは_mbsstr)を使う
・みつからなかったらそのままファイル2に出力
・見つかった場合、
その直後がIDと見なせるものかチェックして、
もしIDらしいのなら'*'で行の内容を上書き。
・出力
でいいんじゃないですかね。
'*'で書き潰す前後でデータの長さが変わるわけじゃないので
単純に上書きでいいでしょう。
面倒なので細かい注意事項は書きませんが、
また引っかかるようならその辺補足ででても書いてください。
親切な誰かが事細かに説明してくれるかもしれませんけど。
この回答への補足
ご丁寧に回答してくださりありがとうございます。
完全には理解しきれていませんが、参考にさせていただき
なんとか完成させたいと思います。
ちなみになんですが、mallocやcalloc等を用いて、読み込むバッファの領域を確保する必要などはないのでしょうか?
基本的な質問ばかりですみませんが、ご回答頂けると幸いです。
No.1
- 回答日時:
★アドバイス
・最初にファイルの入出力はどんな方法で行っていますか?
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を使用したほうが良いとのことですが、引数の設定の仕方などがあまりよく分らないもので・・・
・できれば、処理速度も考慮に入れたいです。
お手数お掛けしますが、ご教授の程よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server SQL 期間内の実施数を合計したい 2 2023/03/03 22:28
- Wi-Fi・無線LAN PCWi-Fiの設定方法がわからなくて困っています。 4 2022/12/28 18:30
- 医師・看護師・助産師 看護専門学校の入学志望動機の添削をお願い致します(400~800字以内) 2 2022/07/17 14:39
- UNIX・Linux VirtualBox ゲストOSにPC内蔵HDDのパーティションをマウントする方法は? 2 2023/05/06 22:52
- 医療 同じ医療法人の病院の受診 1 2022/06/04 01:39
- 病院・検査 大学病院の外来をかかりつけ医にする方法…症状が安定した後も継続して受診できる人とできない人の差は何? 6 2023/03/04 12:15
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- 病院・検査 受診についての質問です。 父70歳。現在も嘱託ながら勤務中。 現在、同じ病院グループクリニックの内科 2 2022/05/28 04:29
- 教育・文化 高校生です。将来政治家になって犯罪率を0.0%代にしたいのですが、可能だと思いますか? ㅤ 大まかな 8 2022/08/27 18:51
- ハッキング・フィッシング詐欺 スマホアプリのトラッキング 個人情報について 5 2023/03/31 08:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列内の数字削除
-
SetWindowTextについて。
-
構造体が戻り値の関数について...
-
WM_CHAR or WM_KEYDOWN の「wPa...
-
C言語のintとcharの違いってな...
-
C言語にて構造体のメンバがNULL...
-
new charとnew char[N]の違いは?
-
文字列str内の全ての数字を...
-
C言語において、以下の条件で...
-
strcat関数を自作したいです
-
ポインタを使用 [数字列を数値...
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
C言語で文字列をかえす正しい書...
-
文字の代入とコピーについて
-
小数点入りの文字列をfloat型に...
-
callocについて
-
'\\0'とはなんですか?
-
p = (char **)*p の意味
-
C言語を用いた環境変数の作成/...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
strcat関数を自作したいです
-
fstream型オブジェクトを関数の...
-
new charとnew char[N]の違いは?
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
char 文字列型 の表現範囲が-12...
-
const char* s1とただのchar s1...
-
wsprintf( ポインタ , "%d" , "...
-
c言語でポインタ変数を用いた配...
-
char型にint型の数値を代入する。
-
C言語で文字列をかえす正しい書...
-
C++17で、unsigned char * 配列...
-
共用体について
-
エクセルのMID関数は、C言語では?
おすすめ情報