• 締切済み

テキストファイル内の任意の単語を含む一行を削除させたい

メインのテキストファイルを別のテキストファイルに記述されたキーワードに合致する行を削除したいのです。 例:honbun.txtの内容が むかしむかし、あるところに お爺さんと お婆さんが 住んでいました。 ある日、お爺さんは 山へ芝刈りに キーワードリスト:key.txt が むかし お爺さん 芝刈り である時、結果を result.txt に書き出すとして お婆さんが 住んでいました。 という結果を導きたいのです。 コマンド処理をしたいので、プログラム名を ABC.exeと仮定して >abc.exe honbun.txt key.txt result.txt のようなコマンドラインで処理できるようなプログラムを考えています。 オーサリングツールとしてVC++.net があるのですが、あいにくプログラミングの知識が乏しいため、こんな簡単なプログラムも出来ません。 どなたかお力添えいただければ幸いです。

みんなの回答

  • gooshibu
  • ベストアンサー率50% (2/4)
回答No.3

簡単なプログラムと書かれていますが、日本語処理を実現するのは簡単ではありません。 このプログラムのポイントをまとめてみます。 1.コマンド処理  コマンドライン引数のとり方は分かりますか?  パラメータの数をチェックし、必要な数がそろっていることを確認した後で、文字列を取得します。  具体的に言うとargcが4である場合に、argv[1]を本文ファイル名、argv[2]をキーワードファイル名、argv[3]を結果ファイル名とします。 2.ファイル処理  ファイルをどのように読み込んで処理を行い、書き込むのかは分かりますか?  扱うファイルの中で本文ファイルがおそらく一番大きいと思うので、読み込みを1回だけとするのが良いでしょう。  キーワードファイルのサイズが小さい場合、全部をメモリに読み込んでおいて比較に用いるのが良いと思います。  結果ファイルは、順次書き込んで行くだけなので特に問題はありませんね。  ファイルの読み込み方と書き込み方は、どの関数を用いるかで処理方法も変わるので、具体的な記述は避けます。 3.文字列の比較  文字列中の文字列を検出するにはstrstr関数を使用すればよいので問題ないのですが、ここで日本語が引っかかります。  まず、日本語処理は必須でしょうか?その際、使用する文字コードは規定されているのでしょうか?それとも汎用なのでしょうか?  文字コードが規定されている場合、そこからUNICODEに変換し、対応関数を用いるのが簡単です。もとからUNICODEであれば変換の必要すらありません。  文字コードが規定されていない場合は文字コードの判別から必要になるので、文字コードの種類を調べるところからはじめなければなりません。  こんなところでしょうか。VC++.netというところでWindowsだろうという想像はできますが、開発環境と動作環境はなるべく詳しく書いて頂けると回答も的確になると思います。

  • rub_oil
  • ベストアンサー率14% (3/21)
回答No.2

ぼへーっと考えたのですが 1.入力ファイルを開き、ファイルのサイズを取得する。 2.NGワードファイルを読み、NGワードを取得して、閉じる。 3.出力ファイルを開く。 3.以下、読み込み量=ファイルサイズになるまで繰り返し 3.11文字づつ読み込み、\nかどうかをチェック 3.2\nまで読み込んだら、それまで読み込んだモノを1行として    ソコにNGワードが含まれてるかチェックする。 3.3含まれてなかったら出力ファイルに書き出す 3.4読み込み領域のクリア 4.読み込み量=ファイルサイズになったはずなので、開いたファイルを閉じる。 5.終了 こんな感じでしょうか。 まさか、全部ソースを書けって話でしたか?

gldneg
質問者

お礼

フローのイメージが取れました。 ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「プログラムを作りたい」のか「処理をしたいだけ」なのかわかりませんが, 後者なら grep か fgrep で検索すると幸せになれるような気がする.

gldneg
質問者

お礼

基本的にはプログラムを作る予定です。 マクロだとサーバ処理に難があるので、、。 アドバイスありがとうございました。

関連するQ&A

  • テキストファイルにおいて任意の単語を含む一行を削除させたい

    テキストファイルの任意の単語を含む一行を削除させるプログラムを作成したいです。 例えば、 test.txt 今日は久しぶりに晴れました。 とてもいい天気だったので、ショッピングに。 その後、アップルストアにて新発売のMacを触ってきました。 上記のようなテキストファイル(test.txt)に対して、 データベース等に格納されている単語のリストと参照させ、 リストにある単語を含んでいる行を削除させたテキストファイルを生成させたいです。 例えば、リストに"天気"の単語があれば、 以下のようなテキストファイルを生成させたいです。 result.txt 今日は久しぶりに晴れました。 その後、アップルストアにて新発売のMacを触ってきました。 このようにするには、どのようにプログラムを作成すればよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • テキストファイルの任意の文字以降の文字列を削除したい

    test.txt AAA+あいうえお BBB+かきくけこ CCC+さしすせそ DDD+たちつてと EEE+なにぬねの 上記(test.txt)のようなテキストファイルから、各行の+以降の文字列を削除して、 以下(result.txt)のようなテキストファイルを生成させるプログラムを作成させたいです。 result.txt AAA BBB CCC DDD EEE このようなプログラムを作るにはどのようにすればよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 昔話の

    むかしむかし、あるところに、おじいさんとおばあさんが住んでいました。おじいさんは山へ芝刈りに、おばあさんは川へ洗濯に…… というのは昔話の有名な書き出しですが、おばあさんの役割は分かります。ですが、おじいさんがやっている「芝刈り」とはどんな作業のことなんでしょうか? 芝って、あのとっても背の短い芝のこと? それを刈ったとして生活にどう利用していたのでしょうか?

  • diffコマンドにてテキスト出力

    こんばんは。教えてください! 以下のような2つのファイルがあるとします。 ・aaa.txt abc111 abc222 abc333 ・bbb.txt abc333 abc444 これを比較して、比較結果をテキスト出力したいです。 テキスト出力したい比較結果は (1)重複しているもの全てテキスト出力 (2)aaa.txtのみにあるものをテキスト出力 (3)bbb.txtのみにあるものをテキスト出力 また、(1)~(3)は別々のファイルに出力したいです。 diffコマンドで、 diff a.txt b.txt >> c.txt とすると、 1つのテキストファイル(c.txt)に (1)~(3)すべてが書かれてしまいます。 環境は、windows XPにてCygwinを使用しています。 diffコマンドでなくても構いません。 宜しくお願いします。

  • バッチファイル テキストファイル内の最後の\以下を削除したい

    バッチで、あるテキストファイル内の最後の\以下を削除して、その結果をバッチの値として利用したいです。 ●テスト条件 %TEMP%のtest.txt に以下のテキスト。 C:\Program Files\software\top xyz ●求める結果: 行末から最初の\以下の文字列を削除。この文字列をバッチファイルで使いたい。 C:\Program Files\software\ ●試したコマンド: なし 全体の流れとしては、バッチでquery取得したパスの不要な部分を削除して、求まったパス(のdirの結果を出力するために)を再度バッチで利用したいです。適切なコマンド・方法がありましたらお願いいたします。

  • 二つのテキストファイルを行単位で交互に一つに

    10000行のテキストファイルが二つあります。 二つのテキストファイルの内容を行単位で交互に結合させて一つのテキストファイルにまとめたいのですが 例えると下記のようにしたいです。 二つのテキストファイルA.txtとB.txtがあるとします。 ---------------------------------------------- A.txt ああああああああああああああ ささささささささささささささささ ななななななななななななななな ------------------------------------------------ ------------------------------------------------ B.txt かかかかかかかかかかかかかか たたたたたたたたたたたたたた はははははははははははははは ----------------------------------------------- A.txtとB.txtの内容を行単位で交互に一つのテキストファイルとしてC.txtのように保存したいです。 ----------------------------------------------- C.txt ああああああああああああああ かかかかかかかかかかかかかか ささささささささささささささささ たたたたたたたたたたたたたた ななななななななななななななな はははははははははははははは ---------------------------------------------- 検索して調べてみたのですが Pasteコマンドで実現させる方法を試してみたのですが うまくいかず、もしかしたらWindowsにもともと備わっていない機能なのではないかと思い検索したらbusybox64.exeを ダウンロードしてインストールしようと思いましたが コマンドプロンプトにbusybox64.exe --installを 入力してみますとうまく生きました。 busyboxを使わずに行単位で交互にテキストファイルを結合させる方法も知りたいです。 よろしくお願い致します。 返答をお待ちしております。

  • ファイルのコピー(コマンドプロンプト・シェル

    Windows10で、ファイルABC001.txtがあり、 ABC002.txt ABC003.txt ~ ABC100.txt とコピーしたいです。 手作業では時間がかかるので、コマンドプロンプト・パワーシェル からコマンドで処理する方法はありますか? よろしくお願いします。

  • バッチファイルで定期的にファイル削除を行う方法

    windows2003サーバーでテキストファイルにプログラムの処理結果を記述させています。 そのログファイルを1日に1回削除するバッチファイルを作成しようと考えています。 以下のような動きをするようにするにはどのように記述したら良いのでしょうか。(ログファイルの名前をlog.txtとします。) 1,log.txtを削除 2,0キロバイトのlog.txtを作成 「log.txtを削除」はdelコマンドでできますが、「0キロバイトのlog.txtを作成」でファイル新規作成のコマンドがわかりません。 もし分かる方がいましたら教えてください。

  • 2つのファイルを用いた文字列置換(削除)の方法

    こんにちは。 テキストファイルA.txtに、検索したい文字列を1行ずつ入れておき、別のテキストファイルB.txtのうち、A.txtにある文字が含まれている行を削除するという作業をしたいです。 例えば A.txt AAA BBB B.txt hoge hogeAAAhoge hogeBhoge hogeBBBhoge の場合、 hoge hogeBhoge を出力させたいです。 このような処理ができる方法はないでしょうか?(コマンドやプログラム等)

  • DOSで多数のファイルをリネームしたい

    「ABC00000.txt」から「ABC00999.txt」という千のファイルがあるのですが、これらの名前をすべて「ABC000.txt」から「ABC999.txt」という風に、中のゼロを二つ消した形にリネームしたいと思っています。 これを実現する為のコマンド、もしくはバッチ処理の方法を教えてください。

専門家に質問してみよう