質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

解決済

【c】検索した文字列と同一の記事を取得したいです.

studyprg
studyprg

総合スコア41

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

5回答

-4評価

0クリップ

579閲覧

投稿2022/07/03 13:08

編集2022/07/06 12:49

やりたいこと

自然言語処理について勉強しています。
Wikipediaのdumpデータから本文を抜き出して処理をしようと思ってます。
xmlの処理について試しているのですが、出力結果が想定とは違って困っています。

やりたいこととしては以下です.
・list_history0.txt の各行が欲しい記事の "タイトル" を示している。
・get_X1.txt の各行が (xml ファイル内の記事の ) "タイトル", "id", "開始バイトオフセット", "バイトサイズ" を示している。
・list_history0.txt から一行ずつ読み込み、 get_X1.txt からタイトルが一致する行を探して"開始バイトオフセット", "バイトサイズ"を利用して xml ファイルからその記事を取り出し、「タイトル(タブ)id(改行)記事」を history_0text.txt に書き出す

プログラミングはあまり得意ではないです。

ソースコードとファイル構成

list_history0.txt(get_X1.txtの一部)

日本ゴルフツアー機構 ファイル:十弗駅看板.jpg 桂米朝 国道101号 笑福亭松鶴 リサジュー図形 ムラカ 日淳 井原裕士

次にget_X1.txt

遠山景晋 493646 2948 0 双子 (映画) 1011517 13316 12558 ユダヤ史関連人物の一覧 1855796 18478 68347 Trip trip 56477 87361 0 新銀行東京 615917 91374 90824 東京都道444号下石神井大泉線 61977 144134 143579 野川さくら 1485326 147328 146788 リメンバー・ミー 1740912 231113 230616 ダヒル・リヤレ・カヒン 787401 233208 232520 ソマリランドの大統領一覧 1094317 237068 236399 バルティ 1094317 242216 3511 歌がチカラ 56477 246360 0 トーンチャン 994927 250016 1231 北海道道145号伊達インター線 1428473 251833 0 アクセス禁止 97976 255003 254438 蒲池城 928380 274271 1331 新潟地震 1583832 276296 0 長崎貿易 872478 310391 309847 春牟古丹島 730521 319037 318416 スター誕生! 1873614 325384 324878 サーキット 1037035 456227 455590 Wikipedia:今日は何の日 9月 597321 510011 44598 WP 1617964 555804 2507 栄町駅 (札幌市) 366911 558992 0 北海道中央バス 1599928 574344 573819 広島電鉄1300形電車 6896 668607 668053 柳川鍋 924713 669194 668686 京都市内の通り 191555 676990 37953 由布岳 918416 715450 0 HN 1486874 724007 723488 コンセルヴァトワール 910758 724984 724479 玉川砂記子 1094317 729024 728336 シラガゴケ類 397108 782982 782331 NC 059668 785975 5126 スギゴケ 1781685 791744 0 摂津源氏 990884 794923 794341 NE 262022 805690 805156 NG 1718990 808263 807633 源氏嫡流 279186 810908 810440 魔性の子 1680100 819840 819300 NI 474 844662 844142 NL 104512 846162 845675 翼細胞 208476 847883 847316 NO 230804 848873 848430 多田源氏 990884 850953 850420 NR 786173 863825 863328 フワランポーン駅 1356379 866728 866158 キングカメハメハ 1693773 886601 886041 OM 387704 978075 977510 苔 826261 980849 980395 徐世昌 16765 988907 988200 NY市警緊急出動部隊 トゥルー・ブルー 791294 997442 996895 PE 1627601 1006180 3452 セラミック噴射装置 3751 1010197 0 堀内賢雄 12357 1010829 1010266 筑後宇都宮氏 575671 1197925 1197423 リンカーン (競走馬) 194189 1202581 1201984 PK 703098 1223633 3515 真田町 1231761 1229043 6504 トンファー 503710 1236096 0 情報処理技術者試験 444436 1244748 1244203 キングマンボ 1728221 1308947 1308351 イースター (曖昧さ回避) 120987 1322716 1322186 田中新兵衛 760804 1324023 1323537 PR 703098 1331531 1331062 PT 665832 1336401 1335869 高橋俊昌 291984 1341864 1341250 PW 136753 1350315 1349839 坂城町 685790 1352052 1351543 セレン整流器 1094317 1362107 1361338 ポリアクリルアミドゲル電気泳動 520484 1365670 1365099 シェルピンスキー数 990884 1371139 1370494 はだしのゲン 1126159 1379494 1378926 伊王島町 1338147 1525866 1525301 ノイローゼ 371027 1539066 1538569 原子力発電所 1084393 1540501 1539942 宮崎県総合運動公園第二硬式野球場 320096 1569579 7259 藤田瞳子 1094317 1578500 6210 赤外分光法 1768613 1585235 0 宇都宮清原工業団地 850234 1599642 1599097 樊噲 262022 1603667 1603179 国道385号線 7146 1611313 1610756 深川 1094317 1612117 1611379 碓氷第三橋梁 308365 1616321 5517         //読み込みたいところ 日本ゴルフツアー機構 870371 1623035 25562 ファイル:十弗駅看板.jpg 1780509 1649736 682 桂米朝 1589144 1652031 1217 国道101号 643806 1654059 0 笑福亭松鶴 1143138 1672954 1672423 リサジュー図形 1037035 1682479 1681821 ムラカ 885381 1691394 14441 日淳 1037035 1706472 0 井原裕士 308365 1710132 1709601         //読み込みたいところここまで ソマリア内戦 1037035 1714267 36576 深川 (江東区) 020100 1751367 0 日昇 833366 1764959 1764447 以下略

次にソースコードです.//追記に現在のソースを追加してます.

#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 256 * 1024 * 1024 int main() { int p = 0; int pb[3] = {}; char *line = malloc(SIZE); char *title = malloc(SIZE); char *id = malloc(SIZE); char *text = malloc(SIZE); char *stitle=malloc(SIZE); FILE *fp = NULL; FILE *fr = NULL; FILE *fr2 = NULL; FILE *gt = NULL; fp = fopen("jawiki-20211220-pages-articles-multistream2.xml", "r");//大元.wiki記事 fr = fopen("list_history0.txt", "r"); //読み込むファイル検索文字列 fr2 = fopen("get_X1.txt", "r");//読み込むファイル2タイトルとidが記入 gt = fopen("history_0text.txt", "w"); //書き込むファイル while (fscanf(fr, "%s\n", stitle) != EOF) { printf("Stitle(検索対象)is %s.\n", stitle); while (fscanf(fr2, "%s\t%s\t%d\t%d\n", title, id, &pb[0], &pb[1]) != EOF) { printf("確認用title:%s\tID:%s\n",title,id); if ((strcmp(stitle, title) == 0)) //タイトルが見つかった時. { printf("%s is found! title:%s\n", stitle, title); fseek(fp, pb[0], SEEK_SET); fgets(text, pb[1], fp); printf("%s\t%s\n%s", title, id, text); } else { continue; } } } printf("\n\n\nprocess ok!\n\n\n"); fclose(fp); fclose(fr); fclose(fr2); fclose(gt); }

一応現在の実行結果です.

追記:

今のソースコードです.
タイトルとid処理を一通りやって終わってるようです.
以下ソースコードと実行結果です.idとタイトルは表示できてるようです.

#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 256 * 1024 * 1024 int main() { int p = 0; int pb[3] = {}; char *line = malloc(SIZE); char *title = malloc(SIZE); int *id = malloc(SIZE); char *text = malloc(SIZE); char *stitle=malloc(SIZE); FILE *fp = NULL; FILE *fr = NULL; FILE *fr2 = NULL; FILE *gt = NULL; fp = fopen("jawiki-20211220-pages-articles-multistream2.xml", "r");//大元.wiki記事 fr = fopen("list_history0.txt", "r"); //読み込むファイル検索文字列 fr2 = fopen("get_X1.txt", "r");//読み込むファイル2タイトルとidが記入 gt = fopen("history_0text.txt", "w"); //書き込むファイル while (fscanf(fr, "%s\n", stitle) != EOF) { printf("Stitle(検索対象)is %s.\n", stitle); fr2 = fopen("get_X1.txt", "r"); while (fscanf(fr2, "%s\t%d\t%d\t%d\n", title, id, &pb[0], &pb[1]) != EOF) { printf("確認用title:%s\tID:%d\n",title,id); if ((strcmp(stitle, title) == 0)) //タイトルが見つかった時. { printf("%s is found! title:%s\n", stitle, title); fseek(fp, pb[0], SEEK_SET); fgets(text, pb[1], fp); printf("%s\t%d\n%s", title, id, text); } else { continue; } } fclose(fr2); } printf("\n\n\nprocess ok!\n\n\n"); fclose(fp); fclose(fr); fclose(gt); }

cmd

確認用title:警察学校 ID:1463812096 確認用title:ファイル:Kasai-ichijyoji-kaizan1.JPG ID:1463812096 確認用title:Template:石勝線 ID:1463812096 確認用title:ロドピ山脈 ID:1463812096 確認用title:ボブ・ゲルドフ ID:1463812096 確認用title:Template:根室本線2 ID:1463812096 確認用title:商船三井ビルディング ID:1463812096 確認用title:Template:根室本線1 ID:1463812096 確認用title:ファイル:Kasai-ichijyoji-Jougyoudou.JPG ID:1463812096 確認用title:Category:干潟 ID:1463812096 確認用title:Template:根室本線3 ID:1463812096 確認用title:ジュゼッペ・マッツィーニ ID:1463812096 確認用title:総括制御 ID:1463812096 確認用title:羽車 ID:1463812096 確認用title:Template:釧網本線 ID:1463812096 確認用title:劇団たいしゅう小説家 ID:1463812096 確認用title:応急手当普及員 ID:1463812096 確認用title:河内十人斬り ID:1463812096 確認用title:Template:石北本線 ID:1463812096 確認用title:宇佐美-網代バイパス ID:1463812096 確認用title:ファイル:Kasai-ichijyoji-33jizo.JPG ID:1463812096 確認用title:鈴木邦彦 ID:1463812096 確認用title:(作曲家) ID:1463812096 確認用title:島根県道201号湯里停車場祖式線 ID:1463812096 確認用title:Template:宗谷本線 ID:1463812096 確認用title:ゴーロン星人 ID:1463812096 確認用title:ロベルト・デュラン ID:1463812096 確認用title:アフォンソ1世 ID:1463812096 確認用title:(ポルトガル王) ID:1463812096 確認用title:グルンヴァルト ID:1463812096 確認用title:島根県道186号美郷大森線 ID:1463812096 確認用title:堀内昭義 ID:1463812096 確認用title:ファイル:Akame48Taki-iriguchi.JPG ID:1463812096 確認用title:出雲バイパス ID:1463812096 確認用title:アズバーズ ID:1463812096 確認用title:大沢悠里のにっぽん元気カンパニー ID:1463812096 確認用title:堀口健治 ID:1463812096 確認用title:島根県道288号瓜坂川合線 ID:1463812096 確認用title:トヨタ・M型エンジン ID:1463812096 確認用title:パルマラット ID:1463812096 確認用title:地名に由来する小惑星の一覧 ID:1463812096 確認用title:Wikipedia:削除依頼/アルバムの一覧 ID:1463812096 確認用title:人名に因む名を持つ小惑星の一覧 ID:1463812096 確認用title:日本神話に関する名を持つ小惑星の一覧 ID:1463812096 確認用title:吾妻橋 ID:1463812096

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

y_waiwai

2022/07/03 13:42

で、問題はなんでしょうか
studyprg

2022/07/03 13:44

実行結果が見つかってない時の処理になっていてこれを見たかった時に行う処理を行えるようになりたいです。 結論から言うとhistory0textを中身がある状態で取得したいです
y_waiwai

2022/07/03 13:47

質問文は編集できるので、そっちに追記しよう。 何を聞きたいのか説明しよう #いまだ質問がなにか不明
jimbe

2022/07/03 15:22 編集

>検索したい記事の文字列(list_history0.txt)が記事のタイトル,id,記事の開始バイトと記事のサイズのバイトが記入されているファイル(get_X1.txt)のタイトルが同一の時に記事の開始バイトと記事サイズのバイトを読み込んでテキストファイル(history_0text.txt)に書き込んでいきたいです. 文章を詰め込み過ぎです。 ・list_history0.txt の各行が欲しい記事の "タイトル" を示している。 ・get_X1.txt の各行が (xml ファイル内の記事の ) "タイトル", "id", "開始バイトオフセット", "バイトサイズ" を示している。 list_history0.txt から一行ずつ読み込み、 get_X1.txt からタイトルが一致する行を探して xml ファイルからその記事を取り出し、「タイトル(タブ)id(改行)記事」を history_0text.txt に書き出す…ということでしょうか。 > printf("%sは見つかりませんでした.\n", stitle); のことを「見つかっていない時の処理」と表現されているようですが、この表示は見つかっても見つからなくても実行される状態です。 >見たかった時に行う処理 「見つかった時に行う処理」の誤字でしょうか。 >history0textを中身がある状態で取得したい つまり現状は「出力されるはずのファイルに中身が無い」ということでしょうか。 表現が独特です。
jimbe

2022/07/03 15:27 編集

少なくともファイルが読み込めているか等の確認をしていないのでしょう。 fr2 が全く使われておりません。
studyprg

2022/07/03 15:29

一応frとgoの読み込みは確認しているはずです。 fr2を組み込んだのが今の状態です。
thkana

2022/07/03 15:29

すでに指摘はありますが、 > 検索したい記事の文字列(list_history0.txt)が記事のタイトル,id,記事の開始バイトと記事のサイズのバイトが記入されているファイル(get_X1.txt)のタイトルが同一の時 日本語として読めません。 「なに」と「なに」とが同一だというのでしょう? (こういうのがちゃんと整理して書けないようだと、それはプログラムに影響しますから...)
studyprg

2022/07/03 15:30

jimbeさんの0:22のやつですが 全くもってその通りだと思います。
studyprg

2022/07/03 15:32

thanksさん "history0.txtに格納されている文字列(記事のタイトル名)"が、"get_x1.txtの記事のタイトル名"と同一の時に取得したいです。 言い方あってますかね?
jimbe

2022/07/03 16:01

>一応frとgoの読み込みは確認しているはずです。 go とは何でしょう。 もし gt のことでしたら、 コード内でコメントされている通り「書き込むファイル」ですので読む必要は無いものと思いますが…。 >fr2を組み込んだのが今の状態です。 組み込んだのでしたら、これも読めているか確認するべきではないでしょうか。
studyprg

2022/07/03 16:12

確認しますね
studyprg

2022/07/03 16:13

わかりました fr2をよみこまなあかんとこにgym指定してますね。
studyprg

2022/07/03 16:41

文言の修正と現在のソースコードを書き込みました.
dodox86

2022/07/04 00:26

書き込みたいと言うファイルはfopenで開いているだけで書いていないし、"get_X1.txt"を開いてfscanfで読み続けていますが、いったんファイルの最後まで読んだら終わりになってるように見えます。このご質問に限らず「プログラミングはあまり得意ではないです」と注意書きがありましたが、現状のコードでは明らかに処理が足りないです。 「要望どおりに動かすにはどうコードを追加して直したら良いでしょうか」とのような質問なのでしょうか。
Zuishin

2022/07/04 00:56 編集

ちなみに、C 言語である必要があるんでしょうか? 他の言語であれば数行でできるような処理ではないかと思います。 あと XML は関係ありませんね。TSV だと思いますが、TSV ということすらも質問にはほとんど関係ありません。
studyprg

2022/07/04 02:50

dodox86さん そうですね。 どのようにしたらいいですかね? ご教授願いませんか?
studyprg

2022/07/04 02:51

zuishinさん  削除しておきます。
Zuishin

2022/07/04 02:55

無視は「わかりきったことを聞くな」という意味ですか?
studyprg

2022/07/04 02:56

そんなに怒らないでほしいです。 tagについて知らなかったぼくの落ち度です。
Zuishin

2022/07/04 03:05

タグだけではなく質問中に多く xml と書いてありますが、私の言っているのはそれではありません。 C 言語でなければ簡単に済むのに、なぜわざわざ C 言語なのかと聞いています。
Zuishin

2022/07/04 03:06

行数が増えると読めないというだけなら、分割して書きます。
jimbe

2022/07/04 03:08

>文言の修正と現在のソースコードを書き込みました. コードが変わりますと実行結果も変わると思うのですが、結果のほうが書き換えられていないように見えます。 どうなりましたでしょうか。
studyprg

2022/07/04 03:08

c言語なのは縛りみたいなものですね。 今までcでやってきたので ソースごとにコロコロ言語変えるのは一貫性ないなあと思ってます。 一応これでxml関係は終わりのはずなので。
Zuishin

2022/07/04 03:15

繰り返しますが、xml は無関係です。 一貫性どころか、何も学習できていません。
studyprg

2022/07/04 03:16

jimbeさん なんもかわってないっすね。
jimbe

2022/07/04 04:26 編集

出力ファイルへの書き込みに関しましては(そもそも書き込み処理がありませんので)変わっていないと思いますが、少なくとも > printf("%sは見つかりませんでした.\n", stitle); が無くなっていますので表示は変わったはずですね。 プログラミングに対してあまり積極的になれないようですが、本件は回答側が取り出し元の xml データにアクセス出来ませんので、プログラムの実行結果は studyprg さんにご提示頂くしかありません。 データ・コード・結果が一貫していないと、どれが正しいのか分からなくなります。 プログラムとしては「//タイトルが見つかった時.」の if 文が成立しなければなりませんので、なぜ成立していないのかを調べる必要があります。 if 文の strcmp のパラメータ stitle と title のうち、 title は "char *title = malloc(SIZE);" として領域確保・アドレス設定をしていますが、 stitle は如何でしょう。"char *stitle;" としか書かれておらず、その領域・アドレスは全く不明です。これは、どこかのメモリ内容を破壊しながら動作していることを意味します。 まずは stitle に領域を設定しては如何でしょうか。 また、stitle と同じように、 fr2 の scan 後に title や id を表示して読めているかを見るというのもテだと思います。 それらによってどのような結果になるのか、その結果から何が想像され、さらにそれを確認するにはどうすれば良いのかを考えてみてください。
studyprg

2022/07/04 04:47

わかりました 調べて提示しますね
studyprg

2022/07/04 05:46

jimbeさん 一応実行結果です. Stitle(検索対象)is 日本ゴルフツアー機構. Stitle(検索対象)is ファイル:十弗駅看板.jpg. Stitle(検索対象)is 桂米朝. Stitle(検索対象)is 国道101号. Stitle(検索対象)is 笑福亭松鶴. Stitle(検索対象)is リサジュー図形. Stitle(検索対象)is ムラカ. Stitle(検索対象)is 日淳. Stitle(検索対象)is 井原裕士. process ok!
studyprg

2022/07/04 06:52

idとタイトルも一部入れ替わってるみたいですね.
jimbe

2022/07/04 11:20

tatsu99 さんの回答のほうで解析(?)が進んでおられるようですので、枝を分けない為にこちらでは一旦止めたほうが良さそうです。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。