从 .csv 文件中提取值

Extract value from .csv file

我正在研究 STM32F429,我想从 csv 文件中提取值。我的 csv 文件包含超过 200.000 个值,这些值都在一行中。例如,我想读取第 14896 个和第 14897 个逗号之间的值。我怎样才能做到这一点?

USBH_Initialize (0);

while (1) {
    result = USBH_MSC_DriveMount ("U0:");
    if (result == USBH_MSC_OK) {
        e = fopen ("montest.csv", "r");
        if (e) {
            fread (fbuf, sizeof (fbuf), 1 ,e);
            fclose (e);
        }
    }
    osDelay (1000);
}

我觉得这个方案不错。这个想法是将 CSV 文件转换为二进制文件(一系列浮点数)。转换后,您可以将二进制文件提供给 MCU 并使用函数 getVal()(如下所示)读取数据。

此代码将文件 data.csv 转换为文件 data.bin:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <malloc.h>

int main(void)
{
    FILE * fin=NULL;
    FILE * fout=NULL;
    char * buff, *tmp;
    float val;
    int cnt=0;

    size_t bsize;

    fin=fopen("data.csv","r");
    if (fin==NULL) {
        perror("1 - Error");
        return errno;
    }

    fseek(fin,0,SEEK_END);
    bsize=ftell(fin);
    if (!bsize) {
        puts("The file doesn't contain data!");
        return -1;
    }

    buff=malloc(bsize+1);
    if (buff==NULL) {
        perror("2 - Error");
        return errno;
    }

    fout=fopen("data.bin","w");
    if (fout==NULL) {
        perror("3 - Error");
        return errno;
    }

    fseek(fin,0,SEEK_SET);
    fread(buff,1,bsize,fin);
    buff[bsize]=0;
    fclose(fin);

    tmp=buff;
    do {
        val=strtof(tmp,&tmp);
        printf("%12g ",val);
        if ((++cnt)%5==0)
            puts("");
        fwrite(&val,sizeof(val),1,fout);
        if (*tmp!=0)
            tmp++;
    } while(*tmp!=0);

    puts("\nEnd of conversion\n");

    fclose(fout);
    free(buff);

    return 0;
}

此函数从包含二进制格式的浮点数据的二进制文件中读取一个字段:

float getVal(FILE *f, size_t index)
{
    float val;

    fseek(f,index*sizeof(val),SEEK_SET);
    fread(&val,1,sizeof(val),f);

    return val;
}

这个主要使用函数 getVal() 从文件中获取数据 data.bin:

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

float getVal(FILE *f, size_t index);

int main(void)
{
    FILE * fin;
    size_t index;

    fin=fopen("data.bin","r");
    if (fin==NULL) {
        perror("1 - Error");
        return errno;
    }

    while(1) {
        printf("Insert index from 1 to n [Insert 0 to end]: ");
        scanf("%lu",&index);
        if (index==0)
            break;

        printf("%g\n",getVal(fin,index-1));
    }

    fclose(fin);
    return 0 ;

}