如何在C中读取CSV文件

368yc8dk  于 2023-03-27  发布在  其他
关注(0)|答案(4)|浏览(162)

我正在尝试读取以下格式的CSV文件:

5,455,78,5
12245,4,78
1,455,4557,1,8,9

我设法打开了文件,但我不知道如何解释数据。所有数据都写在第一列,但我不知道有多少行或每行有多少条目。这是我打开文件的代码。

printf("File chosen is: %s", file);
    
    int p = 0;
    
    FILE *myFile = NULL;
    
    myFile = fopen(file, "r");
    
    if (myFile == NULL)
    {
        exit(1);
    }
    
    if (myFile != NULL)
    {
        printf("\n\nFile read successfully");
    }
yhived7q

yhived7q1#

这应该会解析你的csv文件。打开文件后,使用fgets读取每一行。循环直到fgets返回NULL,这表示没有行可以读取,并且你到达了文件的结尾。使用strtok从fgets中解析你的行,使用逗号作为你的分隔符。

#include <stdio.h>  // file handling functions
#include <stdlib.h> // atoi
#include <string.h> // strtok

...

    char buffer[80];
    while (fgets(buffer, 80, myFile)) {
        // If you only need the first column of each row
        char *token = strtok(buffer, ",");
        if (token) {
            int n = atoi(token);
            printf("%d\n", n);
        }

        // If you need all the values in a row
        char *token = strtok(buffer, ",");
        while (token) { 
            // Just printing each integer here but handle as needed
            int n = atoi(token);
            printf("%d\n", n);

            token = strtok(NULL, ",");
        }
    }

...
tez616oj

tez616oj2#

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

const char* getfield(char* line, int num)
{
    const char* tok;
    for (tok = strtok(line, ",");
        tok && *tok;
        tok = strtok(NULL, ",\n"))
    {
        if (!--num)
            return tok;
    }
    return NULL;
}

int main()
{
    FILE *stream = fopen("yourfile.csv", "r");
    int i = 0;
    int j = 0;
    printf("Choose a line to be given its elements: ");
    scanf("%d", &j);
    char line[1024];
    while (fgets(line, 1024, stream))
    {
        char* tmp = _strdup(line);
        i++;
        printf("Element %d would be %s\n", i, getfield(tmp, j));
        free(tmp);
    }
}
vjhs03f7

vjhs03f73#

谢谢你发布了一些代码,但是你没有提到你想做什么,一旦你读到你的数据。
我会给予你一些提示:
使用一个已知大小的数组从文件中读取数据,并将其缓冲以进行处理。

char buffer[1000];

  while (fgets(buffer, sizeof (buffer), myFile))
  {
    char *data = strtok(buffer, ",");

    while (data !=NULL)
    {
        printf("Data %s\n", data);
        /* Further processing of data */

        data = strtok(NULL, ",");
    }
  }

  fclose(myFile);

使用strtok处理缓冲区以分离字符串。标记是数据分隔符,应该是',',但我不清楚是否也有换行符,但它需要一致。
处理上面返回的字符串。

8ehkhllq

8ehkhllq4#

如果文件包含数字列表行,下面是一个简单的解析器:

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

// return the number of integer in the line, accept empty fields as 0
int parse_line(const char *line, int *array, int len) {
    const char *p = line;
    char *endp;
    int i = 0;

    while (i < len) {
        long n = strtol(p, &endp, 10);
        if (n > INT_MAX) n = INT_MAX;
        if (n < INT_MIN) n = INT_MIN;
        if (*endp == ',' || *endp == ';' || *endp == '\n')
            endp++;
        else
            break;
        array[i++] = n;
        p = endp;
    }
    return i;
}

int main(int argc, char *argv[]) {    
    FILE *myFile = stdin;
    if (argc > 2) {
        const char *file = argv[1];
        printf("File chosen is: %s\n", file);
        myFile = fopen(file, "r");
        if (myFile == NULL) {
            fprintf(stderr, "cannot open %s: %s\n", file, strerror(errno));
            return 1;
        }
    }
    char line[100];
    int array[50];
    while (fgets(line, sizeof line, myFile)) {
        int n = parse_line(line, array, sizeof(array) / sizeof(array[0]));
        for (int i = 0; i < n; i++)
            printf("%d%c", array[i], ",\n"[i == n - 1]);
    }
    return 0;
}

相关问题