• ベストアンサー

特定の文字列が一致する行から、文字列を抽出する方法

ファイルから、特定の文字列を検索し、その文字列に対応する文字列を取得したいのですが、どなたか方法を教えていただけないでしょうか? 処理: test.txt中に以下の文字列が記載されています。 ----- TEST011:FILE00 TEST01:FILE01 TEST02:FILE02 XTEST01:FILE01 XTEST02:FILE02 ----- test.txtから、TEST01に対応する文字列FILE01を取得したいです。 当初、strchrを利用すれば良いかと考えていたのですが、 TEST011の行が先に抽出されてしまい、うまくいきません。 どなたか解決方法を教えていただけないでしょうか。

  • rui58
  • お礼率70% (14/20)

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

  • ベストアンサー
  • towad
  • ベストアンサー率80% (4/5)
回答No.3

strtok()で':'をトークンとして文字列を切り出し、検索文字列と比較すると良いのではないでしょうか。 #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp; char line[256]; char* ptr; if (argc < 2) return 0; fp = fopen("test.txt","rt"); while (fgets(line, 255, fp)) { ptr = strtok(line, ":"); if (strcmp(ptr, argv[1]) == 0) { ptr = strtok(NULL, "\n"); printf("%s\n", ptr); } } fclose(fp); return 0; } > ./a.out TEST01 FILE01 >

rui58
質問者

お礼

ご回答ありがとうございます。 この関数はしりませんでした。 とても参考になりました。

その他の回答 (3)

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.4

>"TEST01:"は、順序が異なる場合、 "XTEST01:"を検索してしまうのではないでしょうか? strchr() や strstr() は戻り値として、どこでマッチしたかを返すので問題ないと思いますけど

rui58
質問者

お礼

なるほど、マッチした位置を確認すればいいのですね。 気づきませんでした。 ご助言いただき、ありがとうございます。

  • chie65535
  • ベストアンサー率43% (8524/19373)
回答No.2

>test.txtから、TEST01に対応する文字列FILE01を取得したいです。 >当初、strchrを利用すれば良いかと考えていたのですが、 >TEST011の行が先に抽出されてしまい、うまくいきません。 検索キーが「TEST01」で TEST011:FILE00 ←一致しない TEST01:FILE01 ←一致する TEST02:FILE02 ←一致しない XTEST01:FILE01 ←一致しない XTEST02:FILE02 ←一致しない としたければ 「先頭から"TEST01"で始まっていて、直後に":"がある行」を検索すれば良いでしょう。 言い換えれば「先頭から"TEST01:"で始まっている行」です。 処理としては 1.検索文字の後ろに":"を付加する("TEST01"を"TEST01:"にする) 2.test.txtから読み込んだ1行の先頭から、検索文字に一致するか調べる 3.EOFになるまで2を繰り返す となります。 #include <stdio.h> #include <string.h> int main(void) { char input_string[256]; char check_string[256]; char read_string[256]; char find_string[256]; FILE *fp; int length; fp = fopen("test.txt","rt"); gets(input_string); strcpy(check_string,input_string); strcat(check_string,":"); length = strlen(check_string); for(;;){ if (foef(fp)) break; fgets(read_string,256,fp); if (!strncmp(read_string,check_string,length)) { strcpy(find_string,read_string[length]); printf("%s\n",find_string); break; } } fclose(fp); return 0; } 上記プログラムは「肝心な部分はこういう風に書けば良い」と言う例示なので、動作試験していません。また、エラーチェックもしていません。バッファオーバーフローも考慮していません。 実用にするなら「エラーをチェックする」「文字列の最大長を考慮する」「getsやstrcpyなど危険な関数は使わない」必要があるので、変更しましょう。

rui58
質問者

お礼

サンプルプログラムまで作成していただき、ありがとうございます。 実装がイメージでき、とても参考になりました。

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

"TEST01:" で検索ではいかんの?

rui58
質問者

補足

質問が適切ではありませんでしたが、txt内の順序が違う場合にも対応したいです。 "TEST01:"は、順序が異なる場合、 "XTEST01:"を検索してしまうのではないでしょうか?

関連するQ&A

  • ある文字列を含む行の抽出

    お世話になります。 いくつかのテキストファイルがあり、それらのファイルのなかの、特定の文字列を含む行をすべて抽出して、別ファイルに集めて保存するようなことを、自動的に行うことはできますでしょうか?? officeソフトでできればよいのですが、ほかの方法でもかまいません。 お願いいたします。

  • DOSの文字抽出

    findstrで特定の行を抽出できました。 test.txtというファイルに入っています。 85文字のうちの43行目から8文字抽出したいのですが、どうすればいいでしょうか?

  • txtファイルから特定の文字列が書かれた行だけを取得や削除するソフト

    txtファイルで 特定の文字列が書かれた行だけを 取得や削除するソフトや方法を探しています。 フリーで無いなら、シェアウェアなどになってもかまいません 例えば (12)と書かれた文字列がある行だけを抜きだしたり 逆に(12)と書かれた文字列がある行だけを削除したり したいです。 そのソフトの操作方法も教えてくださると助かります。 では、回答を心よりお待ちしております。

  • 文字列の抽出がうまくできません

    こんにちは。Perl初心者です。みなさんのお力をお借りしたく、初めて投稿させていただきました。よろしくお願いします。 現在、ファイルから特定した行を抽出し、その行に含まれる文字列を抽出しようとしているのですが、その文字列の抽出がうまくできません。 <文字列を含むファイル:xxx.txt> -------------------------- To 鈴木 太郎さん 1行目 : 01,りんご, 3 個, ナシ, 1個 14行目 02,キャベツ, 3 個, なす, 10本 15行目 : -------------------------- <スクリプトファイル:yyy.pl> -------------------------- open(DAT, "./xxx.txt") || die("can't open file : ($!)"); @file = <DAT>; close DAT; if ( $file[0] =~ /(\W+\s)(\W+)/ ) { print "$1\n"; } print "$file[13]\n"; print "$file[14]\n"; -------------------------- <結果> -------------------------- 鈴木 -------------------------- 抽出したい結果は「鈴木 太郎」なんですが、上記のような結果(「1byteのスペース」鈴木「2byteのスペース」)になってしまいます。xxx.txtの「To」と「鈴木」の間と、「鈴木」と「太郎」の間にはそれぞれ1byteのスペースがあります。どうやったら「鈴木 太郎」と抽出できるか教えてください。 スクリプトは「Copal2(ver2.77)」というツールを使って作りました。そのツールではエンコードは「自動判別」となっており実際何が使われているのか分かりません。 また他にも質問があります。 今抽出したい行を指定して出力させてますが、 「To」から始まる行 「01」といった2桁の数字から始まる行 というような抽出の仕方をしたいのですが可能でしょうか? 本当に初心で大変恐縮ではありますが、教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ファイル内の複数の特定文字列を抽出する方法

    ファイル内の複数の特定文字列を抽出する方法 linuxで、あるファイル内の特定のパターンに 該当する文字列の抽出方法を教えてください。 やりたいこと・前提条件 (0)linuxといいながら実はCygwin(タブン影響しないと思う) (1)特定のパターンはファイル内のどこに出現するか分からない (2)特定のパターン文字列中には改行は含まない。つまり必ず同一行内 (3)特定のパターンはファイル中に0回以上出現する (4)まったく同じ文字列は省きたい (5)特定のパターンは同一行中に複数回出現することもあり、すべて抽出する とりあえず、以下のコマンドを書きましたが不十分です。 grep -E "${PATTARN}" log.txt | sed -r "s/^.*(${PATTARN}).*$/\1/g" | sort -u これだと、(0)~(4)までの希望は実現できました。 (5)が未実現です。 JavaとかJavaScriptとかvbsとかなら正規表現にヒットした複数の文字列を 連続的に取り出して処理する方法は思い浮かぶのですが、 linuxコマンドの範囲だとどうすればいいかよくわかりません。 (5)を実現する方法。これを教えてください。 参考情報としてサンプルファイル内容と正規表現パターン・ 得たい結果も書いておきます。よろしくお願いします。 ◎参考 ○log.txt -------- RASCAL-1, RASCAL-123 [RASCAL-456] *** ** * *** [RASCAL-1] RASCAL-456 RASCAL-45 -------- ○PATTARN=RASCAL\-[0-9]{1,5} ○得たい結果 RASCAL-1 RASCAL-45 RASCAL-123 RASCAL-456

  • 特定文字列で囲まれた範囲を抜き書きするためには?

    特定の文字列で開始され、特定の文字列で終了するテキストの一部を抜き出すためには、コマンドラインからは perl -ne 'print if /開始文字列/ .. /終了文字列/' file.txt でできると思うのですが、これがたとえば $page 変数に入ったテキストで同様の処理を Perl 内部のスクリプトで行う時にはどうすればいいのでしょうか? while(<$page>){ ... } とかやって1行1行処理してみようと思ったのだけど、できません。

    • ベストアンサー
    • Perl
  • 特定文字列の抽出

    VB6の質問です。 桁数、データが不定の文字列中から特定文字を抽出したいのでが、方法を教えていただけないでしょうか? 抽出したいデータの桁数が毎回不定でMid, Left, Right関数が使用できません。 Dim Buffer As String Buffer = "A12345...B678910.TRAGET..C" '桁数、データが不定の文字列がBufferに入ります。 例えば、変数Bufferから、桁数を考慮しないで"TARGET"の文字列を抽出したのです。 InStr関数で、位置を特定して、Mid関数などで抽出するれば、良いと思うのですが これをどんな桁数のときも対応できるようにルーチン化にできないでしょうか?

  • エクセル:文字列間の行を抽出

    エクセルファイルで1つのシートに複数の表がひたすら縦に並んでいます。それぞれの表が別々のシートに記載されるようにしたいと思っています。 どの表も基本的な書式は同じなので列数は同じなのですが、行数は表ごとに異なります。 また各表の右下(C列)にTotalという文字列が必ずあります。 文字列Totalがある行の直下の行から次のTotalのある行まで抽出して、シートを作成できれば良いのだと思うのですが、どうすれば可能になるのか分かりません。 どなたか教えていただけ無いでしょうか。

  • 特定文字列を含まない行を削除

    以前特定文字列を含む行を削除する方法の質問をし、正規表現を置換することでできることを知りました。^.*特定の文字列.*\n 今度は特定文字列を含まない行を削除を削除したいです。 この場合どう記述すればいいでしょうか? また、特定文字列1と特定文字列2のどちらかを含まない行を削除する方法もあわせて知りたいです。

  • 文字列データの抽出容易にしたい

    あるログから特定の文字列を抽出したいのですが 方法が思いつかず困っています ログには下記に示したパターンが複数個あります。 TEST: *****: 種別コード  **************** ************************  テスト結果(OKorBAD) *:可変長の文字列 この中からテスト種別コードと テスト結果を抜き出して ☆☆☆☆,OK ★★★★,OK ■■■■,BAD   : : 上記のデータにまとめたいのですがどうすればよいのでしょうか? 私自身はC言語はある程度理解しているつもりですが 文字列処理は苦手です。 このようなケースを対処しようした場合、最適なスクリプト言語 や方法論でも構いませんのでご教示いただければと思います。 いちからじっくり挑戦したいと思っています。 出来れば参考になるコードも合わせて記載していただけると 助かります。 どうか御願いいたします。

専門家に質問してみよう