• ベストアンサー

文字列置換のアルゴリズムを教えてください。(Windowsプログラミング)

はじめまして。まだプログラミングを始めて間もない学生です。 現在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を用いて。標準関数を用いてもよい。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.12

★??? ・課題の仕様は分かりました。 >そして、またまた追加で申し訳ないのですが、一行に同じタイプの置換該当箇所が二箇所以上あった場合、 >現在のソースでは初めの一箇所しか置換できないと思うのですが、どのように修正することで解決できるでしょうか。 >いろいろと試してはいるのですが、なかなか上手く行きません。  ↑  処理のアルゴリズムを整理すべきです。  ここがはっきりしていないと試行錯誤しても無意味です。時間が勿体無いです。 >何だか一番に最初ご質問させて頂いたことよりどんどん要求が高くなってきてしまい、 >申し訳ない気持ちであるのと同時に、自分能力では手に負えない領域に突入してしまった感がありますが、 >最後まで頑張りたいと思います。  ↑  回答No.1~No.11 までをよく読み、提示したソースがなぜそれで上手くいき、自力で作ったソースでは  上手くいかなかったり、無駄に2回ファイルを読んでいたりするかを比較して下さい。  よく読み理解すれば二箇所以上の置換も自力で解決できるはずです。  決して手に負えない領域に突入してはいないはずです。 >P.S. 全角アスタリスクへの置換、上手くできました。紹介していただいた関数のサンプルは、 >今からじっくり読んで理解したいと思います。 >ありがとうございました。  ↑  応援します。頑張って下さい。  上手く出来たらソースを見せてくれると嬉しいです。  それではこれが最後のアドバイスとなることを祈っています。 ・以上。

kenkenpo
質問者

補足

返信が遅くなってしまい、すみませんでした。 週末忙しかったため、メモリを動的に確保する部分にはまだ手を付けられていないのですが、 それ以外はなんとか思うような動きをするようになりました。 検索文字列のパターンが増えた場合にも対応できるように、検索&置き換えの機能を関数化しました。 完成版のソースを載せられるように、頑張ります。 いつも、親身なアドバイス本当にありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (11)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答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/win111.html
kenkenpo
質問者

補足

早速のご回答ありがとうございます。 ・現在、ファイル入出力は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

  • フォルダ内のファイルを全て開き文字列置換

    こんばんは。Perl超初心者です(プログラミングの初心者でもあります)。 フォルダ内にあるすべてのファイルに対して、正規表現を使った文字列置換をしたいのですが、うまくいきません。アドヴァイスをいただけないでしょうか。 具体的には、あるファルダの中に100個程のファイルがあって、その中の改行が3回連続している部分を、「改行+[SAMPLE]+改行」に置換をしたいと表います。 Windows XP Professional SP3 / ActivePerl 5.10 の環境で、以下のように記述したのですが、「Missing $ on loop variable at insert.pl line 5.」とエラーになってしまいます。どこで、間違ったのでしょうか(というか、まるでダメなスクリプトかもしれませんが…)。 use strict; use warnings; my @filename = glob "*.txt"; foreach open(FILE, "$filename(@filename)") { my @content =<FILE>; @content =~ s/\n{3}/\n[SAMPLE]\n/g; print FILE @content; close(FILE); } どなたか、ご教示いただけると非常助かります。 よろしくお願い致します。

    • ベストアンサー
    • Perl
  • 文字列一括置換ソフトを探してます

    文字列一括置換ソフトを探してます・・・って書くと、Vectorに行けばいっぱいあると言われそうですが、ちょっと条件が特殊です。 ・複数(多分500~1000個)のテキストファイルの指定文字列を一括置換したい(ここまでは普通) ・対象の文字列の置換パターンが3万件(苦笑) ワイルドカードなどではなく、3万の単語を別の3万の単語に置換したいのです。 (プログラムの変数を、ネーミングルールを変えたために総入れ替えする・・・と考えて頂ければ分かっていただけるでしょうか) 10件くらいのパターンを連続して置換するソフトは見つかったのですが、3万件となると・・・。 (そもそも3万件のリストをよく作ったもんだ) UNIXにsedというコマンドがあるというのは聞いたことがあるのですが、Windows(&DOS)しか触ったことがないので、どうすれば良いのか分かりません(私はプログラマじゃありません)。 なお、同じネタでエクセルのワークシートのセルを置換する必要があるのですが、こちらは自作マクロで対応しています。 もし適当なソフトが見つからなければ、エクセルマクロの作成を検討しています。 (マクロでテキストファイルの読み込みはやったことがあるのですが、書き出しは多分やったことがない) 置換リストはエクセルで作成しているので、リストはソフトに応じた形式で準備できると思います。 以上、よろしくお願いいたします。

  • 複数行に渡る文字列の置換

    こんにちは、Perl初心者です(プログラミング全般の初心者です)。 カレントフォルダ内のテキストファイルに対して、文字列置換をするスクリプトを書こうとしています。具体的には、以下のようにストリングIDの直下に改行のみの場合(ストリングがない)は、[BLANK]という文字列を挿入したいと思っています。 TEXT_STRING_ID_001<改行> <改行> <改行> TEXT_STRING_ID_002<改行> 入門書やこのサイトの皆さまのお力を借りて、なんとか以下のようなリストを書きエラーなく置換処理ができるところまでは確認できました。 しかし、この方法だと結局1行ずつ処理していることになるので、「s/\n{3}/\n[en]\n/gm」のような置換ができません(mオプションをつけてもダメなようです)。 この問題を解決する良い方法はないものでしょうか。 (もしかすると、処理の仕方を根本から変えないといけないのでしょうか) 以下、現状のリスト: use strict; use warnings; my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while (my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /\.txt$/); print $dir, "\n"; open(FILE, $dir) or die "$dir: $!"; my @file = <FILE>; close(FILE); foreach my $line (@file) { $line =~ s/\n{3}/\n[BLANK]\n/gm; } open(NEWFILE, "> $dir") or die "$dir: $!"; print NEWFILE @file; close(NEWFILE); } closedir(DIR);

    • ベストアンサー
    • Perl
  • 今プログラミングを始めるなら何がいいでしょうか?

    ずばり。今、プログラミングを始めるなら何がいいでしょうか? Windowsで動いて、これから成長していきそうな そんな言語はなんですか? 必要なものなど、簡単に教えていただけるとなお良いです どの言語で何ができて、どうやったら環境が整うかとかも知りたいので プログラミング言語について詳しいサイト、本、雑誌などあれば そちらの紹介もお願いします 適度に硬くなく、読みやすいければさらに良いです よろしくお願いします

  • Windowsプログラミングで

    当方、10年程前に、某ゲーム系専門学校に通ってまして プログラミングの方を専攻しておりました。 当時の学校の開発環境はPC-9801やX68000で学校では C言語や65816の授業がありました。 また当時は私はX68000が好きだったこともあり68000 のアセンブラ等も勉強してました。 当時挫折を味わい学校も辞め二年ほどプログラムという よりはパソコンから完全に離れてしまいました。 でもパソコンとかを触ったりするのはやはり好きだったので Windows95搭載パソコンを買ってしまいました。 CPUがPentium2とかMMX Pentiumとか言われてもちんぷんかんぷん でしたしDirectXが出てきて、3Dアクセラレーターボード等が 普及してきてましたが二年間程離れていたせいで3Dゲームを プレイするために必要なマシンとかも分からなかったくらい です。 VC++5.0とかも買ってしまいましたが、学校で勉強したのは 概ねシングルタスク環境での開発ですので異様な違和感を 覚えました。イベントドリブン型プログラミングに馴染めない というかMFCやWindowsAPIの関数の複雑さに圧倒されたというか そんな感じです。 二年間離れていたから対応できなくなったとは思っていませんが Windows95発売から10年以上経過した今、専門学校に入学するのが 数年遅かったら・・・もしくは数年生まれるのが遅かったら等とは 思ったりします。 結局、今では自分にプログラミングにセンスが無かったと思ってますが 「MS-DOS等では開発したことがあるがWindowsでは出来ません」 というような人がいるということをプログラム関係の本で 読んだり、あるいは専門学校の講師とかソフト開発会社の人 に聞いたことがあります。 長々と書きましたが、自分のように実務経験が無く、 あくまで趣味の域でやってる人ならともかく、職業として プログラマーをしている人はどうなのでしょうか? プログラマーとして飯食ってるひとがWindowsプログラム等の イベントドリブン型プログラミングに対応出来なかったら 死活問題だと思うのですがどうなのでしょうか? それとも実務経験のある人にはそもそもそういう人は いないのでしょうか? 長年の疑問だったので何方か答えて頂ければうれしいです。

  • プログラミング

    ソフトウェアに対して、初心者がプログラミングを始めたいのですが、独学でやるために必要な、環境とは、どのようなものでしょうか? 基本的に、ハイスペックPC(ゲーム用に使っていた)は、持っています。 個人的に調べた結果 Microsoft visual stadio .net シリーズ が、あればいいのかと思ったのですが、いかがでしょう? また、独学が出来る本も先ず何がいいのかも教えて下さい。

  • csvデータの置換について

    お世話になります。 batファイルを利用してcsvファイルの数値の置換をしたのですが、ご教授下さい。 詳細は下記になります。 【環境】 Windows2008 Server 【対象ファイル】 test.csv 【実施内容】 ファイルの内容は下記になります。 A,111,aaa B,222,bbb C,333,ccc D,444,ddd E,555,eee 上記の内容で数値を下記のように置換したい。 111は111F 222は222G 333は333H 444は444I 555は555J よろしくお願い致します。

  • プログラミングの勉強

    業務などで必要なソフトを作成できるようになりたいので プログラミングの勉強をしようと思うのですが、 たくさんの種類があってどれがいいのかわかりません フリー環境がそろい 習得のための参考書などが充実していて 広い範囲の用途に対応できるプログラミング言語は何でしょうか? 主に Windowsで動くGUIのソフトを作成したいと思っています。 Javaの関係でも Java Beans とEclipseとかあり、わからなくなりました。 よろしくお願いします

  • マックでwindowプログラミングするには?

    マック(MacOSX)でWindowプログラミングするにはどのような環境が必要でしょうか? MS-WindowsにはVisualC++やVisualBasicなどがありますが、マックに関しては調べてもよくわからないです。 Windowではないgccでのコンソールレベルのプログラムならネット上で多数見つかりましたが、Windowだけがなかなか見つからないです。 マックでWindowプログラミングができる環境にはどんなものがあるのでしょうか?無料、有料(予算2万円以下)どちらでもいいので教えてください。 #Javaは除くものとします。

  • cygwinでのGUIプログラミングのしかたin Windows

    2ヶ月ほど前からC言語の勉強をしており、基本ライブラリ程度は使えるようになり、C++の文法を吸収しはじめてます。 そこで、そろそろGUIプログラミングをしたいなと思ったのですが、プログラミング環境としてはCUIが好きで、GUIアプリであるVisual C++などはできれば使いたくありません。というかマウス操作が頻繁なプログラミングは格好がわるい・・(変わり者でしょうか。) そこで耳にした(というかネットで調べまくった)のが、cygwinを使えばVisual C++などなしでもGUIプログラミングができるというような事柄なのですが、そういうようなことが書いてあるサイトって、ほとんどが(というか見たところでは全部が)、「しかし、ここではVisual C++で勉強をしていきましょう」などの内容で、cygwinでのGUIプログラミング方法について有用な情報を得ることはできませんでした。 なので、cygwinで本当にWindows用GUIプログラミングができるのか、もしそうであれば、その方法や大まかな流れなどのご教授、あるいはURIや書籍の紹介をしてほしく思います。