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

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

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

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

C

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

XML

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

Q&A

解決済

1回答

925閲覧

【c言語】テキストファイルからバイト数を算出したい

studyprg

総合スコア57

Objective-C

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

C

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

XML

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

0グッド

1クリップ

投稿2022/06/19 04:33

編集2022/06/19 05:45

やりたいこと

自然言語処理について勉強しています。

Wikipediaのdumpデータから本文を抜き出して処理をしようと思ってます。
xmlの処理について試しているのですが、難航しています.
欲しい出力は,,<text ~~</text>のシークポイント(pb[0])と〜〜部分のバイト数(pb[1])の記入されたファイルです.(同様に<title>,<id>も欲しい)
シークポイントとバイト数さえわかれば後述の2つ目のプログラムを使って
後述の実行結果のpb[0]部分が0と表示されていて困ってます.

プログラミング構成

jawiki-20211220-pages-articles-multistream2.xml(読み込み先のテキストファイル)
Wiki_getter1_Byte.c(バイト数を算出するプログラム,<Page>〜〜</page>間は取得できている.)
Wikigetter2_text.c(getter1の出力ファイル(get_text_Byte.txt系列)からシークポイントまでfseekしてバイト数分freadしてテキストファイルに記入上と同じくページ全体とテキスト部分が取得できている.)
以下にソースコードを貼り付けます。

#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 256 * 1024 * 1024 int main() { int p, pb[2]; char *line = malloc(SIZE); FILE *fp = fopen("jawiki-20211220-pages-articles-multistream2.xml", "r"); FILE *fw = fopen("get_text_byte.txt", "w"); // printf(fw,"startbyte\t記事のbyte \n"); if ((NULL == fp) || (NULL == fw)) abort(); while (p = ftell(fp), fgets(line, SIZE, fp)) { if (strstr(line, "<text")) { pb[0] = p; if (strstr(line, "</text>")) { pb[1] = p-pb[0]; } } printf("%d\t%d\n", pb[0], pb[1]); } printf("process ok"); free(line); fclose(fw); fclose(fp); }

========
読み取ったシークポイントとバイトからxmlを抽出するプログラムは既にできているのでこの出力が正しくできるようになりたいです.
*よく言われますが外部ライブラリは利用しない方向でお願いします.
追記に出力の一例を記載しておきます.

出力一例です.pb[1]が取得できてないようです.

14228089 0 34228089 0 34228089 0 34228089 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34254206 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0 34257786 0

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2022/06/19 06:11

if (strstr(line, "<page>")) { ... } の内側に if (strstr(line, "</page>")) { ... } が入ってしまっているので </page> は見付からないでしょうね。
studyprg

2022/06/19 06:12

外側にifを配置してみればいいんですかね?
melian

2022/06/19 06:14

実際には以下の様にすべきかと。 if (strstr(line, "<page>")) { pb[0] = p; } if (strstr(line, "</page>")) { pb[1] = p - pb[0]; printf("%zu\t%zu\n", pb[0], pb[1]); }
studyprg

2022/06/19 06:14

やってみます
studyprg

2022/06/19 07:15

<text>はうまくいきましたが,<title>だとpb[1]が0になるようです.
studyprg

2022/06/19 07:18

修正の指摘で<text~~</text>はうまくいきましたが,<title>~~</title>,<id>~~</id>はpb[1]が0になるようです. タイトルとidは同じ行にあるのが問題なのではないかと思われます.
studyprg

2022/06/19 07:22

少し調べましたが,タイトルの場合,pb[1]=p-pb[0]では,pとpb[0]が同一の値になっているようです.
studyprg

2022/06/19 07:23

idの場合も同じでした.
melian

2022/06/19 07:38

同じ行にある場合とない場合で処理を分ければよいかと。まぁ、(前回の質問でもコメントしましたが) awk を使えば簡単なのですけれどね。。。
studyprg

2022/06/19 07:44

同一行の時はelseifで分岐を分ければいいですかね?
melian

2022/06/19 07:56

while 文の外側で、 char *s; とかしておいて、以下の様になるんじゃないですかね(動作未確認)。行頭にスペースやタブが入っていると、その分ずれますが。 if (strstr(line, "<title")) { pb[0] = p; if ((s = strstr(line, "</title>"))) { pb[1] = s - line; printf("%zu\t%zu\n", pb[0], pb[1]); continue; } } if (strstr(line, "</title>")) { pb[1] = p - pb[0]; printf("%zu\t%zu\n", pb[0], pb[1]); }
studyprg

2022/06/19 08:49

タイトルはうまくいきました.idはこのままやるとxml中に複数ある<id>を読んでしまわないか心配です.
studyprg

2022/06/19 08:54

一例として鳥取砂丘のxmlを置いておきます. <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; <中略> [[Category:日本の海岸景勝地]] [[Category:砂丘]] [[Category:平成百景]] [[Category:日本の地質百選]]</text> <sha1>axvz6j2vrmxe3n68ssg11m0w8qtcobn</sha1> </revision> </page>
guest

回答1

0

ベストアンサー

コードの中で全角文字が混じってます。
そこらへん修正してみよう

pb[1] = pーpb[0];


C

1if (strstr(line, "<page>")) 2{ 3 pb[0] = p; 4 if (strstr(line, "</page>")) 5 { 6 pb[1] = p-pb[0]; 7 } 8

あなたのコードを正しく(?)書き直したものですが、
p とpb[0] ってどうころんだところで同一にしかなりませんよ

投稿2022/06/19 04:57

編集2022/06/19 05:13
y_waiwai

総合スコア88163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

studyprg

2022/06/19 04:59

p-pb[0]のとこですよね。 そこは修正しましたが出力は変わらないようです。
y_waiwai

2022/06/19 05:03

まずはきちんとしたコードを提示しないとお話になりません。 で、そこんところ、pにはどういう数値が入っていて、pb[0]にはどういう数値が入っている(つもり)んでしょうか
studyprg

2022/06/19 05:07

p二は現在のファイルポインタが入っています。 on[0]の値は想定ではありますが<text>の<の位置のポインタ乳と思われます
studyprg

2022/06/19 05:41 編集

pは現在のファイルポインタが入っています。 pb[0]の値は想定ではありますが<text>などのの”<“の位置のポインタだと思われます
studyprg

2022/06/19 05:41

ソースコード修正しました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問