[C]idを取得したのに表示ができない.

やりたいこと

自然言語処理について勉強しています。
Wikipediaのdumpデータから本文を抜き出して処理をしようと思ってます。
、出力結果が想定とは全然違って困っています。
欲しい出力は,,<title>hoge</title>と<id>hoge</id>の中身です。(hoge部分)
後述の出力のidが表示されず困っています。
プログラミングはあまり得意ではないです。
外部ライブラリはすぐできてしまうのでなるべく自力で行いたいです.

実行環境

Macbook pro(2017)
OS:11.6.7

以下に用意したファイル(<page>~~</page>)の一部とソースコードを貼り付けます。

get_text_All.txt

<page> <title>遠山景晋</title>//ここが欲しい <ns>0</ns> <id>114795</id>//ここも欲しい. <revision> <id>86493646</id> <parentid>81273289</parentid> <timestamp>2021-11-12T08:36:31Z</timestamp> <contributor> <ip>27.85.204.9</ip> </contributor> <model>wikitext</model> <format>text/x-wiki</format> <text bytes="9434" xml:space="preserve">{{基礎情報 武士 | 氏名 = 遠山景晋 | 画像 = | 画像サイズ = | 画像説明 = | 時代 = [[江戸時代]]後期 | 生誕 = [[宝暦]]14年[[1月14日 (旧暦)|1月14日]]([[1764年]][[2月15日]])&lt;ref&gt;本妙寺の墓碑による([[氏家幹人]]『旗本御家人―驚きの幕臣社会の真実』(洋泉社歴史新書y 2011年)72頁)。&lt;/ref&gt;&lt;ref group=&quot;†&quot;&gt;『[[寛政重修諸家譜]]』などの幕府編纂の資料では宝暦2年([[1752年]])生まれとされているが、それは[[官年]]とみられる(氏家幹人『旗本御家人―驚きの幕臣社会の真実』(洋泉社歴史新書y 2011年)72頁)。&lt;/ref&gt; 中略 [[Category:1837年没]]</text> <sha1>chmmooepsrvwuo4n0ziki50nn5rvhj7</sha1> </revision> //</page>の手前までで終わっている. <page>//次のページ ... ...

ソースコード

Wiki_getter3_title.c

#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 256 * 1024 * 1024 int main() { int p = 0; int b = 0; int pb[5] = {}; int id = 0; char *idnum = malloc(SIZE); char *line = malloc(SIZE); char *title = malloc(SIZE); FILE *fp = NULL; //読み込み FILE *fw = NULL; //書き込み fp = fopen("get_text_all.txt", "r"); fw = fopen("get_title_id.txt", "w"); if ((fp == NULL) || (fw == NULL)) { printf("failed load ファイル"); abort(); } while (p = ftell(fp), fgets(line, BUFSIZ, fp)) { char *p1, *p2; p1 = strstr(line, "<title>"); p2 = strstr(line, "</title>"); if (p1 && p2) // 1行に両方見つかった { b = strlen("<title>"); p1 += strlen("<title>"); // <title>の次の位置 int len = p2 - p1; if (len >= 0) { memcpy(title, p1, len);//これをやるべきなのか?参考までに //fseek(fp, -b, SEEK_CUR); //fseek(fp, p + (p1 - line), SEEK_SET); //<title>まで戻る //fgets(title, len + 1, fp); //読み込んでタイトルに格納 title[len] = '\0'; // 終端記号を忘れずに追加 char *p3, *p4; p3 = strstr(line, "<id>"); p4 = strstr(line, "</id>"); // frite(); // fprintf(fw, "%s\n", title); if (p3 && p4) // 1行に両方見つかった { b = strlen("<id>"); p3 += strlen("</id>"); // <title>の次の位置 int len = p4 - p3; if (len >= 0) { memcpy(idnum, p1, len);//これをやるべきなのか?参考までに // fseek(fp, -b, SEEK_CUR); //fseek(fp, p + (p3 - line), SEEK_SET); //<id>まで戻る //fgets(idnum, len + 1, fp); //読み込んでタイトルに格納 idnum[len] = '\0'; // 終端記号を忘れずに追加 } } } printf("title\tis\t%s\tID:%s\n", title, idnum);//ここのidnumが表示されてない fprintf(fw, "%s\t%s\n", line,idnum); } } printf("process ok"); free(line); free(idnum); free(title); fclose(fp); fclose(fw); }

エラーについて.

タイトルは取得できましたが,idnumが表示されてないです.

terminal

最後の方を表示 title is 島田洋七(ID:). title is 大砂土村(ID:). title is J級潜水艦 (イギリス海軍)(ID:). title is ランカウイ島(ID:). title is 外山雄三(ID:). title is 工藤順子(ID:). process ok

ループの終了位置をミスしているのかな?
idnumが空っぽいですね.

参考程度にget_all_textの一例と欲しい部分です。これが大量に入ったファイルが欲しいです。

get_all_text.txt

<page> <title>鳥取砂丘</title>//ここが欲しい <ns>0</ns>//ここはいらない <id>19812</id>//ここも欲しい <revision> <id>53717095</id> <parentid>53211643</parentid> <timestamp>2014-12-06T03:46:16Z</timestamp> <contributor> <ip>58.156.158.18</ip> </contributor> <comment>/* 砂丘の利用と周辺住民とのかかわり */</comment> <model>wikitext</model> <format>text/x-wiki</format> <text xml:space="preserve">{{Coord|35|32|27.821|N|134|13|41.789|E|region:JP|display=title}} [[ファイル:Tottori-Sakyu Tottori Japan.JPG|thumb|300px|馬の背]] {{mapplot|134.2290|35.5407|鳥取砂丘}} '''鳥取砂丘'''(とっとりさきゅう)は、[[鳥取県]][[鳥取市]]の[[日本海]]海岸に広がる広大な砂礫地で、代表的な[[海岸砂丘]]。日本三大砂丘の1つである&lt;ref&gt;その他の2つについては、諸説ある。&lt;/ref&gt;。[[山陰海岸国立公園]]の特別保護地区に指定されており、南北2.4km、東西16kmに広がる日本最大の観光可能な[[砂丘]]である。(一般に立ち入れない物も含めると、日本最大の砂丘は&lt;!--(内陸にある砂丘を含めると--&gt;[[青森県]]の[[猿ヶ森砂丘]])。&lt;!--内陸砂丘は大陸内部の砂丘を示し、日本には内陸砂丘なないため編集しました--&gt; [[1955年]](昭和30年)に国の[[天然記念物]]に指定された。[[2007年]](平成19年)には[[日本の地質百選]]に選定された。 == 砂丘の状況 == [[中国山地]]の[[花崗岩]]質の[[岩石]]が[[風化]]し、[[千代川]]によって日本海へ流されたあと、海岸に集まったものが砂丘の主な[[砂]]となっている。海中の砂を海岸に向けて流れ寄せる潮流と、海岸線に[[堆積]]した砂を内陸へ吹き込む[[卓越風]]の働きで形成された。 砂丘は千代川の東西に広がっているが、通常「鳥取砂丘」というと、千代川の東側の545haの「浜坂砂丘」を指す。砂丘によって海から切り離されて出来た湖である[[多鯰ヶ池]]がすぐ南東にある。 <中略> </text> <sha1>axvz6j2vrmxe3n68ssg11m0w8qtcobn</sha1> </revision> </page>

コメントを投稿

0 コメント