使用C将CSV导入数组

时间:2015-10-01 10:04:56

标签: c csv

我有一个包含; 分隔符的CSV文件。数据是双重类型,例如: 0.66985787869876; 0.254886543778; 475.36552366 \ n 0.454585787869854; 0.484254886543755578; 512.36552374 \ n

在Cyber​​Spock回答后更新了代码。 我的问题似乎是fgets(仅显示printf)而不是完整的第一个值线

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



double LoadCSV(double *Tab[][100])
{

    char* token;
    double intermed;
    char* test;
    FILE *fp;
    fp = fopen("file.csv","r");
    char line[128];
    int i=0, j=0;

    while (fgets(line, sizeof(line), fp) != NULL)
    {
        for (token = strtok(line,";"); token != NULL ; token = strtok(NULL, ";"))
        {
            token=strchr(token, "\n") ;
            intermed=atof(token);
            printf("%f", intermed);
            *Tab[i][j]= intermed;
            i++;
        }
        printf("%f", *Tab[3][j]);
        j++;

    }

   //fclose(fp);
    return 0;
}

int main(){

double Tab[50][100]; //max fixed size
int k=0;
int l=0;

LoadCSV(Tab);
while (k< 4)
    {
    printf("Tab = %f", Tab[k][l]);
    k++;
    }


}

旧帖子 输入CSV的大小每次都可以不同:一次3列,另外46列。

然后我认为我不能像scanf一样使用scanf(文件,&#34;%f&#34 ;;&#34;%f&#34 ;;&#34;%f&#34;, varA,varB,VarC);因为vars是固定的一次。

虽然我尝试使用此代码,但我对var命名为c:

有问题
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double TabInput[100]; //max fixed size

double LoadCSV()
{

   FILE *fp;
   int c;
   char cumulate[100];
   int i=0;


   fp = fopen("file.csv","r");

   if(fp == NULL)
   {
      perror("Error in opening file");
   }

   while(1)
   {

      c = fgetc(fp);
      if( feof(fp) )
      {
         break ;
      }
      if (c != ";" || c != "\n")
      {
        printf("%s",c);//*************PROBLEM C is an int
        strcat(cumulate, d);//********PROBLEM THERE

      }
      else
      {
          TabInput[i]= atof(cumulate); //str to double
          i++;
      }
        if (c == "\n")
        {
            break ;
        }

   }
   fclose(fp);

   //return(TabInput);
}

int main(){
int j=0;
LoadCSV();
while (j< 4)
    {
    printf("Tab = %f", TabInput[j]);
    j++;
    }


}

感谢您的帮助。最好的。

1 个答案:

答案 0 :(得分:3)

使用 strtok 代替

char line[128];
fgets( line, sizeof(line), fp );
for (char* token = strtok( line, ";"); token != NULL; token = strtok(NULL, ";"))
{
  TabInput[i++] = atof(token);
}

因此,您一次只读一行,然后使用strtok解析该行。

编辑:

strtok将字符串line拆分为多个字符串,并返回指向\ 0终止字符串的指针。您需要做的唯一事情是使用atof将字符串转换为float / double。在for循环令牌的每次迭代中,将指向line中的新字符串。

为了将CSV文件拆分成行和列,您可以执行类似这样的操作

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

#define MAXROWS 10
#define MAXCOLS 5

int main()
{
  int rowIndex = 0;
  double rows[MAXROWS][MAXCOLS] = {{0,0}};
  char line[128];
  char* token = NULL;
  FILE* fp = fopen("myfile.csv","r");
  if (fp != NULL)
  {
    while (fgets( line, sizeof(line), fp) != NULL && rowIndex < MAXROWS)
    {
      int colIndex = 0;
      for (token = strtok( line, ";"); token != NULL && colIndex < MAXCOLS; token = strtok(NULL, ";"))
      {
        rows[rowIndex][colIndex++] = atof(token);
      }
      rowIndex++;
    }
    fclose(fp);
  }

  for (int i = 0; i < rowIndex; ++i)
  {
    for (int j = 0; j < MAXCOLS; ++j)
      printf("%10.4lf", rows[i][j]);
    putchar('\n');
  }

  return 0;
}