C言語関係掲示板

過去ログ

No.927 2つのテキストファイルを比較

[戻る] [ホームページ]
No.11763

2つのテキスト比較
投稿者---クロー(2004/01/14 22:50:04)


2つのテキストファイルを比較したいのですがよくわかりませんので教えて下さい。
詳しい内容は、まずテキスト1にHTMLを利用して書いたソースが記載してあります。テキスト2には、数日後に更新されたソースが記載されています。
そのとき、テキスト1テキスト2の比較を行い新しく記載された内容だけを出力用の別のテキストに記載したいのですが、差分などを行ったのですがなかなかうまくいきません。
どうかご存知のかたがみえましたら、具体的なコードでご教授ください。
一方的なお願いになって申し訳ありません。


No.11771

Re:2つのテキスト比較
投稿者---RAPT(2004/01/15 02:06:22)


まずは、あなたの書いたコードを晒してみてください。
アドバイスはできますが、作製依頼となると、まず見積もりが…

No.11829

Re:2つのテキスト比較
投稿者---クロー(2004/01/15 23:11:23)


>まずは、あなたの書いたコードを晒してみてください。
>アドバイスはできますが、作製依頼となると、まず見積もりが…
返信遅くなりましてすいません。私が制作の参考にしたのがNo817の「テキストファイルから指定した文字列を含む文を抜き出す」というものです。コードは、

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define STR 256

int main(void)
{
FILE *fp_input;
FILE *fp_output;
char *sentence = NULL;
char mojiretu[16];
int i = 0, c;

printf("検索する文字列="); //文字列の入力
scanf("%15s", mojiretu);

if ((fp_input = fopen("input.txt","r")) == NULL) { //ファイルのオープン
printf("ファイルが開けません\n");
return(1);
}
if ((fp_output = fopen("output.txt","w")) == NULL) { //ファイルのオープン
printf("ファイルが開けません\n");
return(1);
}

while ( (c=fgetc(fp_input)) != EOF) {
if ((i % STR) == 0)
sentence = (char *) realloc(sentence, STR*(i/STR+1));
if (c != '\n') sentence[i++] = c;
if (c == '.') {
sentence[i] = '\0';
if(strstr(sentence,mojiretu) != NULL) {
fprintf(fp_output, "%s\n", sentence);
}
free(sentence);
sentence = NULL;
i = 0;
}
}
free(sentence);

fclose(fp_input);
fclose(fp_output);
return(0);
}

です。私が目標としているのは、更新された内容の中からHTMLの部分を除き、文字で書かれている部分だけを出力用のテキストに保存することです。説明がいたらなくてすいません。よろしくお願いします。

No.11830

Re:2つのテキスト比較
投稿者---ともじ(2004/01/15 23:39:50)


>返信遅くなりましてすいません。私が制作の参考にしたのがNo817の
>「テキストファイルから指定した文字列を含む文を抜き出す」というもの
>です。コードは、

>です。私が目標としているのは、更新された内容の中からHTMLの部分
>を除き、文字で書かれている部分だけを出力用のテキストに保存すること
>です。説明がいたらなくてすいません。よろしくお願いします。

このコードから仕様を満たすコードを書くのは難しいのではないでしょうか。

とりあえず、仕様が明確ではありません。
比べるのは、行単位ですか。新しい行が1行増えたら、それ以降は
どう判定しますか。
「文字で書かれている部分だけ」というのも曖昧です。
2つの入力ファイルと、得られる出力ファイルの具体例をあげてみてください。

それから、ソースの添付では、上記「HTML変換ツール」を使ってくださいね。


No.11831

Re:2つのテキスト比較
投稿者---クロー(2004/01/16 00:28:58)


>>返信遅くなりましてすいません。私が制作の参考にしたのがNo817の
>>「テキストファイルから指定した文字列を含む文を抜き出す」というもの
>>です。コードは、
>
>>です。私が目標としているのは、更新された内容の中からHTMLの部分
>>を除き、文字で書かれている部分だけを出力用のテキストに保存すること
>>です。説明がいたらなくてすいません。よろしくお願いします。
>
>このコードから仕様を満たすコードを書くのは難しいのではないでしょうか。
>
>とりあえず、仕様が明確ではありません。
>比べるのは、行単位ですか。新しい行が1行増えたら、それ以降は
>どう判定しますか。

比べるのは文単位が希望です。私が考えているのは、テキスト1の文(ピリオードまで)か改行が行われるまでを読み込み、それがテキスト2の中に存在するならば、その文字を削除する。これを繰り返すことでテキスト2には、テキスト1に無い文字列のみが残ると考えたのですが、このような処理は可能でしょうか?

>「文字で書かれている部分だけ」というのも曖昧です。
>2つの入力ファイルと、得られる出力ファイルの具体例をあげてみてください。

例えばです。
テキスト1
arnonjcduhrotation01[0]["text1"] = "お豆腐";
arnonjcduhrotation01[0]["href1"] = "32.c1625/1??cm=Section2";
arnonjcduhrotation01[0]["text2"] = "枝豆";
arnonjcduhrotation01[0]["href2"] = "32.c1625/2??cm=Section2";
arnonjcduhrotation01[1] = new Array();

テキスト2
arnonjcduhrotation01[0]["text1"] = "お豆腐";
arnonjcduhrotation01[0]["href1"] = "32.c1625/1??cm=Section2";
arnonjcduhrotation01[0]["text2"] = "おにぎり";
arnonjcduhrotation01[0]["href2"] = "32.c1625/2??cm=Section2";
arnonjcduhrotation01[1] = new Array();

出力ファイル
arnonjcduhrotation01[0]["text2"] = "おにぎり";

このような結果が出ると考えています。贅沢を言えば

出力ファイル
おにぎり

という形で保存できれば完璧です。
>
>それから、ソースの添付では、上記「HTML変換ツール」を使ってくださいね。

すみません・・・




No.11877

Re:2つのテキスト比較
投稿者---ともじ(2004/01/16 22:15:03)


>比べるのは文単位が希望です。私が考えているのは、テキスト1の文
>(ピリオードまで)か改行が行われるまでを読み込み、それがテキスト2
>の中に存在するならば、その文字を削除する。これを繰り返すことでテキ
>スト2には、テキスト1に無い文字列のみが残ると考えたのですが、この
>ような処理は可能でしょうか?

文単位とのことですが、改行を区切りとするなら、行単位ではないでしょうか。
また、ピリオドも区切りにする場合、提示の例の
 arnonjcduhrotation01[0]["href1"] = "32.c1625/1??cm=Section2";
は、
 arnonjcduhrotation01[0]["href1"] = "32
 c1625/1??cm=Section2";
二つの文ということになりますよね。それとも、区切りは、ピリオドでは
なく、セミコロン(;)でしょうか。

また、「テキスト1の文がテキスト2の中に存在するならば、その文字を
削除する」ということは、
 テキスト1
  arnonjcduhrotation01[0]["text2"] = "豆";
 テキスト2
  arnonjcduhrotation01[0]["text2"] = "枝豆";
の場合は"枝"が残りますが、それでいいのでしょうか。


No.11879

Re:2つのテキスト比較
投稿者---ともじ(2004/01/16 22:58:40)


以下、単純に2つのファイルの行を比較し、異なる行の、異なる文字以降を
表示するプログラムです。行の挿入などには対応していません。
#include <stdio.h>
#include <string.h>

/* 全角の判定 */
#define iskanji(c) (0x81 <= ((c) & 0xff) && ((c) & 0xff) <= 0x9f || \
                    0xe0 <= ((c) & 0xff) && ((c) & 0xff) <= 0xfc)
#define SIZE 256

int main(void) 
{
    FILE *fin1, *fin2, *fout;
    char s1[SIZE], s2[SIZE];
    int i;

    if ((fin1 = fopen("input1.txt", "r")) == NULL) { 
        printf("input1.txtファイルが開けません\n");
        return 1;
    }
    if ((fin2 = fopen("input2.txt", "r")) == NULL) { 
        printf("input2.txtファイルが開けません\n");
        return 1;
    }
    if ((fout = fopen("output.txt", "w")) == NULL) { 
        printf("output.txtファイルが開けません\n");
        return 1;
    }
 
    while (fgets(s1, SIZE, fin1) != NULL &&
           fgets(s2, SIZE, fin2) != NULL) {
        if (strcmp(s1, s2) != 0) {
            i = 0;
            while (s1[i] != '\0' && s2[i] != '\0') {
                if (iskanji(s1[i]) || iskanji(s2[i])) {
                    if (s1[i] != s2[i] || s1[i+1] != s2[i+1]) break;
                    i += 2;
                }
                else {
                    if (s1[i] != s2[i]) break;
                    i++;
                }
            }
            if (s2[i] != '\0') fputs(&s2[i], fout);
        }
    }
    fclose(fin1);
    fclose(fin2);
    fclose(fout);

    return 0;
}



No.11881

Re:2つのテキスト比較
投稿者---クロー(2004/01/17 00:41:43)


制作ありがとうございます。今制作していただいたプログラムを実行させていただきました。ん〜、やはり思っていたようにはいきませんね。あっそれと、セミコロン、ピリオドという区切りの質問ですが、私の勉強不足です。HTMLの中から枝豆などの求める文字列だけを得られるのであればどちらでもかまいません。枝豆から豆を削除して枝が残るのは、あまり望ましくありません。何か方法あったら教えてください。あと先ほど制作していただいたコードに「半角文字のみ削除」を加えたものがほしいのですが頼めますか。


No.11884

Re:2つのテキスト比較
投稿者---とおり(2004/01/17 15:00:17)


>制作ありがとうございます。今制作していただいたプログラムを実行させていた

>あと先ほど制作していただいたコードに「半角文字のみ削除」を加えたものがほしいのですが頼めますか。

最初にRAPTさんから言われているのに「頼めますか」とはいい根性してますね。
自分で書く気はさらさらないですか。

No.11885

Re:2つのテキスト比較
投稿者---ともじ(2004/01/17 15:29:44)


>最初にRAPTさんから言われているのに「頼めますか」とはいい根性してますね。
>自分で書く気はさらさらないですか。

そうですね。私は作成を依頼されたわけではないので、あくまでも例を
示しました。ですから、意図通り動かない場合もあるでしょう。
クロさんのプログラム作成の参考になれば幸いです。

>枝豆から豆を削除して枝が残るのは、あまり望ましくありません。

結局、テキスト1とテキスト2の各行を比較して、異なっていれば、""で
囲まれた最後の文字列を出力ファイルに書き出せばいいということなの
ですね。そういう仕様でしたら、このホームページの索引から、strrchr
という関数を探して利用してみてください。

「テキスト1とテキスト2の対応する行が異なれば、strrchrで"を後ろから
2回探して、挟まれている文字列を出力する。」こんな感じでいいと思います。
なお、" という文字を探すには、 '\"' と表記してください。

>HTMLの中から

提示のファイルの内容例はHTMLとは言いませんね。HTMLについては、
http://www.kanzaki.com/docs/html/lesson1.html
このあたりを参考になさるといいと思います。