Не может правильно считать элементы в CSV после strtok в C - PullRequest
0 голосов
/ 01 июля 2019

Я только иногда вижу правильное количество элементов после того, как использую strtok для разделения запятыми и кавычками (двойные кавычки).Обычно printf имеет длину 0, но иногда 6 и 1 без изменений в коде.

Я пытался использовать только один разделитель (запятые) и по-разному определять вывод токена strtok, а также переставлять порядок операторов в цикле while, где другие элементы строки предположительно разделены.Это несколько строк файла .csv, который я использую для проверки своего кода (test.csv).Это тот же формат, в котором NOAA предоставляет данные об осадках в виде .csv.

"STATION","NAME","DATE","PRCP","PRCP_ATTRIBUTES"
"US183459384","XYZ ABC 9.0 E, WA US","2019-01-06","0.65",",,N"
"US183459384","XYZ ABC 9.0 E, WA US","2019-01-12","0.46",",,N"
"US183459384","XYZ ABC 9.0 E, WA US","2019-01-13","0.09",",,N"
"US183459384","XYZ ABC 9.0 E, WA US","2019-01-14","0.01",",,N"
"US183459384","XYZ ABC 9.0 E, WA US","2019-01-15","0.60",",,N"
"US183459384","XYZ ABC 9.0 E, WA US","2019-01-16","1.93",",,N"

И моя попытка кода ниже.

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

#define BUFFER_SIZE 1024

int get_row(FILE *file, int row_num, char delim[]) {
    int n_line = 0;
    int field = 0;
    char row[BUFFER_SIZE], *line[BUFFER_SIZE];

    while (fgets(row, BUFFER_SIZE, file)) {
        if (n_line == row_num) {
            printf("Length of line %d is %ld elements!\n", n_line, strlen(row));
            char* element = strtok(row, delim);
            while (element != NULL) {
                printf("%s\n", element);
                line[field++] = strdup(element);
                element = strtok(NULL, delim);
            }
            return 0;
        } else {
          n_line++;
    }
    printf("There is no row %d in the file you selected.\n", row_num);
    return 0;
}

int main(int argc, char **argv) {
    FILE *file;
    char delim[]  = ", \"";

    file = fopen(”test.csv”, "r");
    if (!file) {
        printf("Error: could not open %s\n", file_name);
        return -1;
    }
    printf("Reading file...\n");
    get_row(file, 0, delim);
    fclose(file);
    return 0;
}

Я ожидаю, что результат покажет 5, норезультат 0 или 1 для всех строк и иногда 6.

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Эта программа не должна компилироваться, так как имя_файла не определено.Кроме того, внутри функции getrow ни один из элементов не должен быть равен полю, а не длине буфера.Также разделитель запятых не будет работать, так как в поле есть запятые.Следующий код работает для указанных строк в файле test.csv

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

#define BUFFER_SIZE 1024

int get_row(FILE *file, int row_num, char delim[]) {
    int n_line = 0;
    int field = 0;
    char row[BUFFER_SIZE], *line[BUFFER_SIZE];

    while (fgets(row, BUFFER_SIZE, file)) {
        if (n_line == row_num) {
            char* element = strtok(row, delim);
            while (element != NULL) {
                if(strcmp(",", element) != 0 &&  strcmp("\n", element) != 0)
                {
                  printf("%s\n", element);
                  line[field++] = strdup(element);
                }
                element = strtok(NULL, delim);
            }
            printf("Length of line %d is %d elements!\n", n_line, field);
            return 0;
        } else {
          n_line++;
    }
  }
    printf("There is no row %d in the file you selected.\n", row_num);
    return 0;
}

int main(int argc, char **argv) {
    FILE *file;
    char delim[]  = "\"";
    char file_name[] = "test.csv";

    file = fopen(file_name, "r");
    if (!file) {
        printf("Error: could not open %s\n", file_name);
        return -1;
    }
    printf("Reading file...\n");
    get_row(file, 0, delim);
    fclose(file);
    return 0;
}
0 голосов
/ 01 июля 2019

Много синтаксических ошибок в программе. Это должно работать:

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

#define BUFFER_SIZE 1024

int get_row(FILE *file, int row_num, char delim[]) {
    char row[BUFFER_SIZE];

    for (int i = 0; fgets(row, BUFFER_SIZE, file); i++) {
        if (i == row_num) {
            printf("Length of line %d is %ld elements!\n", i, strlen(row));

            char* element = strtok(row, delim);
            while (element) {
                printf("%s\n", element);
                element = strtok(NULL, delim);
            }

            break;
        }
    }

    printf("There is no row %d in the file you selected.\n", row_num);

    return 0;

}

int main() {
    FILE *file;
    char delim[]  = ", \"";

    file = fopen("test.csv", "r");
    if (!file) {
        puts("Error: could not open");
        return -1;
    }

    printf("Reading file...\n");
    get_row(file, 0, delim);
    fclose(file);

    return 0;
}
...