我正在研究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);
}
答案 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 ;
}