OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

テキストの文字列から特定のものを抜き出すプログラム

  • 困ってます
  • 質問No.203370
  • 閲覧数472
  • ありがとう数1
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 60% (108/179)

以下のような、テキストファイルを用意しました。

factor EF-G
2117..3334 +40515605614tufA1aq_005JCOG0050

elongation factor EF-Tu
3346..3660 +10415605615rpsJaq_008JCOG0051ribosomal
・・・・というふうにこういうのが延々と続くわけですが、ここから、
2117と3334、3346と3660というふうにここの数字だけを抜きたいんです。
たとえば、fgetcで、1行よんでから、一文字ずつ読んで、何個めから・・みたいに書いていったんですが、どうしてもうまくうごいてくれません。
なにか、ほかにいいアイデアないでしょうか?
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.1
レベル9

ベストアンサー率 47% (37/78)

前提条件として、
1.行の終わりは改行がある
2.抜き出したい数字が含まれる行以外は数字で始まらない
3.抜き出したい数字部分の桁数は固定である
というのが成立するのであれば、
1.fgets()で一行読み込み
2.1文字目(C言語的に言うと0文字目?)が数字か否か?
3.1文字目が数字ならば、1文字目から4文字目までと、7文字目から10文字目を取り出して保存
っていうので、かなりお手軽なプログラムが出来ると思うのですが。
そうでなくても、だいたい似たような処理で出来ると思います。

見たところ、理系の実験データのようですね。
ちょっと、辛口ですが、理系の人なら、発想の転換もお手の物では?
ちょっと目先を変えればすぐ解決しそうなものですが・・・
それとも、自分みたいな工学系の人間とは発想が違うのかな・・・

ちなみに、これがベストというわけではないので、さらに色々工夫してみると
もっとすっきりするかも知れませんね。研究あるのみです。
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.2
レベル11

ベストアンサー率 34% (139/407)

以下の条件が必須になります。 1.抜き出す文字列の前の行には、「factor EF-」が必ずある。 2.抜き出す文字は行の先頭からで、最初の区切りに「..」、次の区切りにスペースがある。 この条件から、以下のような処理が考えられます。(エラー処理は考慮していません。) 1.ターゲットファイルをオープンする。 2.一行読込む。但し、EOFだったら項目8へ。 3.「factor EF-」が ...続きを読む
以下の条件が必須になります。

1.抜き出す文字列の前の行には、「factor EF-」が必ずある。
2.抜き出す文字は行の先頭からで、最初の区切りに「..」、次の区切りにスペースがある。

この条件から、以下のような処理が考えられます。(エラー処理は考慮していません。)
1.ターゲットファイルをオープンする。
2.一行読込む。但し、EOFだったら項目8へ。
3.「factor EF-」が含まれるか確認し、なければ、項目2.へ戻る。
4.一行読込む。但し、EOFだったら項目8へ。
5.「..」の位置を検出し、先頭からその位置までを前半データ保存用領域へコピーする。
6.項目5.の処理で取得した位置からさらにスペースの位置を検出し、項目5.の検出位置+2(「..」の分)から、検出位置までを後半データ保存領域へコピーする。
7.項目2.へ戻る。
8.ファイルをクローズして終了。


  • 回答No.3
レベル12

ベストアンサー率 75% (398/526)

数字が記述された行を特定することはできるのですよね。 ならば、次のようにしてみて下さい。 ・行の読み込み   fgets(buf, DATA_LEN, fp); ・数値の抜き出し   sscanf(buf, "%d%*c%*c%d", &a, &b); 「%*c」というのは、「そこにある1文字は読み捨てろ」という意味です。 つまり、数値と数値の間に ...続きを読む
数字が記述された行を特定することはできるのですよね。
ならば、次のようにしてみて下さい。

・行の読み込み
  fgets(buf, DATA_LEN, fp);
・数値の抜き出し
  sscanf(buf, "%d%*c%*c%d", &a, &b);

「%*c」というのは、「そこにある1文字は読み捨てろ」という意味です。
つまり、数値と数値の間にあるピリオド2つを無視して、数値のみを抜き出します。
  • 回答No.4
レベル10

ベストアンサー率 42% (53/126)

昔の記憶ですみません。unix 系では字句解析を行うルーチンを自動的に生成 する lex/flex というツールがあります。 数字だけで構成されるトークンを切り出すようなものは lex / flex を使えば 簡単に作ることができた思います。 Windows 系の OS にも移植されていたはずです。
昔の記憶ですみません。unix 系では字句解析を行うルーチンを自動的に生成
する lex/flex というツールがあります。
数字だけで構成されるトークンを切り出すようなものは lex / flex を使えば
簡単に作ることができた思います。
Windows 系の OS にも移植されていたはずです。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ