1

What is the most effective way to write a parser in C for data with the following format:

atr#1,atr#2,...,atr#n

btr#1,btr#2,...,btr#n

...

Each record is in new line and attributes are separated with comma.

What function should be used? Do you have any examples?

4

3 に答える 3

2

改行で区切られたファイルを行ごとに読み取り、引数を分割して出力するコードの例を次に示します (たとえば、char *s の配列の配列に解析するように簡単に適応させることができます)。

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

int main()
{
    FILE *f = fopen("file.txt", "r");
    char ptr[1024];
    char *token;

    while (fgets(ptr, 1024, f) != NULL)
    {
        token = strtok(ptr, ",");    
        while(token)
        {
            printf("Token: %s\n", token);
            token = strtok(NULL, ",");
        }
    }
    fclose(f);
    return 0;
}
于 2012-05-25T18:17:58.547 に答える
0

作業に適したツールを選択してください。Perl、Python、または最高の awk で約 1 行です。C を使用するやむを得ない理由がある場合は、投稿で説明してください。それ以外の場合は、言語で面倒なことを行う方法を尋ねるのではなく、仕事に適したツールを選択するようにアドバイスするのが最も賢明な答えだと思います。それが下手です。

コマンドラインから:

tr ',' '\n' < file.txt

コンマを新しい行に変換します。

于 2012-05-25T18:05:04.300 に答える
0

これはうまくいきます:

/* You need the following includes and defines */
#include <stdio.h>
#include <iostream.h>
#include <string.h>
#define NULL_CHAR 0x0

int parse(char* data) {
    const int LINE_SIZE=255; /* Should be long enough for your unparsed data */
    const int MAX_FIELDS=99; /* Maximum number of fields */
    char  output[MAX_FIELDS][LINE_SIZE];
    int   i;
    int   output_field_count;
    int   output_char_idx;

    for (i = 0; i < MAX_FIELDS; i++) {
        strcpy(output[i], "");
    }
    output_field_count = 0;
    output_char_idx    = 0;

    for (i = 0; i < LINE_SIZE; i++) {
        if ((data[i] != ',')  && 
            (output_field_count    < MAX_FIELDS) && 
            ((output_char_idx+1) < LINE_SIZE)) {

            output[output_field_count][output_char_idx]   = data[i];
            output[output_field_count][output_char_idx+1] = NULL_CHAR;
            output_char_idx++;
        }
        else if (data[i] == ',') {
            output_field_count++;
            output_char_idx = 0;
        }
    }
    output_field_count++;
    output_char_idx = 0;

    printf("OUTPUT FIELD COUNT IS: %d\n", output_field_count);
    for (i = 0; i < output_field_count; i++) {
        printf("FIELD %i IS: %s\n", i, output[i]);
    }
    return 0;
}

これは次のように呼び出すことができます。

char data[500]; /* Should be long enough for your unparsed data */
strcpy(data, "atr#1,atr#2,...,atr#n");
parse(data);
strcpy(data, "btr#1,btr#2,...,btr#n");
parse(data);
于 2012-05-25T18:27:53.700 に答える