从.csv文件中提取值

时间:2015-04-17 01:29:11

标签: csv microcontroller stm32f4discovery

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

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);
}

1 个答案:

答案 0 :(得分:0)

我认为这个解决方案很好。我们的想法是将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;
}

这个main使用函数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 ;

}