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

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

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

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

C

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

XML

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

解決済

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

studyprg
studyprg

総合スコア41

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

C

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

XML

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

1回答

0評価

0クリップ

160閲覧

投稿2022/06/13 09:43

編集2022/06/13 23:39

やりたいこと

自然言語処理について勉強しています。
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); }

追記:実行はできましたがidが表示されてません.

wiki_getter3_title.c(更新版)

#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { size_t p, pb[3]; char line[BUFSIZ]; char title[BUFSIZ]; char idnum[BUFSIZ]; FILE *fp = fopen("jawiki-20211220-pages-articles-multistream2.xml", "r"); FILE *fw = fopen("get_text_byte3_title_and_id.txt", "w"); if ((NULL == fp) || (NULL == fw)) abort(); while (p = ftell(fp), fgets(line, BUFSIZ, fp)) { /* if (strstr(line, "<page> ")) pb[0] = p; else if (strstr(line, "</page>")) { pb[1] = p - pb[0]; printf("%zu\t%zu\n", pb[0], pb[1]); fprintf(fw, "%zu\t%zu\n", pb[0], pb[1]); // ... // fprintf(fw, "%d\t%d\n", pb[0], pb[1]); ... テキスト形式で観察可能 */ char *p1, *p2; p1 = strstr(line, "<title>"); p2 = strstr(line, "</title>"); if (p1 && p2) { // 1行に両方見つかった p1 += strlen("<title>"); // <title>の次の位置 int len = p2 - p1; int nowp = atoi(p1); if (len >= 0) { memcpy(title, p1, len); //出力  title[len] = '\0'; // 終端記号を忘れずに追加 } } else { char *p3, *p4; p3 = strstr(line, "<id>"); p4 = strstr(line, "</id>"); if (p3 && p4) { p3 += strlen("<id>"); // <id>の次の位置 int len = p4 - p3; if (len >= 0) { memcpy(idnum, p3, len); //出力  idnum[len] = '\0'; // 終端記号を忘れずに追加 } printf("title:%s\tID:%s\n", title, idnum); fprintf(fw, "%s\t%s\n", line, idnum); } } } fclose(fw); fclose(fp); }

エラーについて.

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

terminal

最後の方を表示

ループの終了位置をミスしているのかな?
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>

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

hoshi-takanori

2022/06/13 10:56

現状だと title と id が同じ行にないと id が取得できないですね。というか、XML を行単位で処理しようという考えがそもそも間違ってる気がします。 「外部ライブラリはすぐできてしまうのでなるべく自力で行いたい」という心がけは立派ですが、XML という構造を持ったフォーマットのデータを C 言語で外部ライブラリを使わずにパーズするのは現実的ではないと思います。「プログラミングはあまり得意ではない」なら特に。 C 言語による文字列操作の習得が主目的ならそれも良いとは思いますが、自然言語処理が目的なら、それに適した言語 (python とか?) で、適度にライブラリを使ってやるのが良いのでは…。
studyprg

2022/06/13 14:39 編集

追記:回答から修正したのですが,タイトルが2〜3回ずつ同じものが表示され,idがバラバラのものが出力されます. ループの中の処理ミスって流と思います. 以下実行時に表示されたものです. 修正版を追記しておきます. title:庄内川 ID:167064 title:庄内川 ID:86359689 title:庄内川 ID:1295347 title:小笠原忠真 ID:167065 title:小笠原忠真 ID:85625747

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

C

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

XML

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