Как проанализировать каждый столбец в файле CSV с помощью C - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь использовать C для чтения файла CSV, итерации построчно (до EOF) и разделения / разделения каждой строки запятой.Затем я хочу разделить каждый столбец на «корзины» и добавить их в структуру (которая здесь не показана; я определил ее в файле помощника) на основе типа.

Например, если у меня есть1,Bob, я бы хотел разделить 1 и Bob на две переменные.Вот что я написал до сих пор.

void readFile(char file[25]) {
    FILE *fp;
    char line[1000];

    fp = fopen(file, "r"))

    while(fgets(line, 1000, fp)) {
        char* tmp = strdup(line);
        char* token;

        while((token = strsep(&tmp, ","))) {
            printf("%s\n", token);  // I want to split token[0] and token[1]
        }
    }
    fclose(fp);
}

T приведенный выше код компилируется и запускается.Я просто не знаю, как получить доступ к каждому разделу token, например token[0] или token[1].В питоне это было бы достаточно просто.Я мог бы просто получить доступ к 1, используя token[0] и Bob, используя token[1] для каждого line.Но здесь, в C, я не могу этого сделать.

В целях тестирования все, что я сейчас делаю, это печатаю каждую строку (во втором цикле while), просто чтобы посмотреть, как выглядит каждое разбиение,Я не реализовал код, в котором я поместил каждую разделенную строку в соответствующий член структуры.

Я искал переполнение стека и нашел множество тем по этой теме.Кажется, никто из них не помог мне, кроме этого , из которого я извлек.Но я не смог заставить работать разделение столбцов.

1 Ответ

0 голосов
/ 22 февраля 2019

В python это было бы достаточно просто.Я мог бы просто получить доступ к 1, используя token[0] и Bob, используя token[1] для каждого line.Но здесь, в C, я не могу этого сделать.

Да, вы можете, если только вы определите массив.

    while (fgets(line, sizeof line, fp))
    {
        char *tmp = strchr(line, '\n');
        if (tmp) *tmp = '\0';   // remove the '\n'
        tmp = strdup(line);
        #define MAXCOLUMNS  2
        char *token[MAXCOLUMNS];
        int c = 0;
        while (tmp)
        {
            if (c == MAXCOLUMNS) puts("too many columns"), exit(1);
            token[c++] = strsep(&tmp, ",");
        }
        if (1 <= c) printf("column 1: %s\n", token[0]);
        if (2 <= c) printf("column 2: %s\n", token[1]);
        // ONLY if the line's tokens are no longer needed:
        free(*token);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...