使用C读取csv文件然后执行字符串操作

时间:2014-03-11 12:39:03

标签: c csv command-line

首先,我使用我的C文件Cars.csv打开一个CSV文件(cars.c)。我的CSV文件如下所示:

toyota, 100, 20, 150.50  
nissan, 200, 50, 100.75  
BMW,    400, 80, 323.00

第1栏是名称,第2栏是库存,第3栏是订单,第4栏是价格。

然后我必须完成两项工作(我将在命令行中调用程序,其中包含工作名称和我需要传递的任何其他参数):

  1. 列出CSV文件中的所有项目,而逗号不能作为输出的一部分。我还必须为每列打印标题。 (./cars list)

  2. 从命令行运行程序时,我会发送一个参数。参数将是我的csv文件中项目的名称。然后我必须从库存中减去1并更新CSV文件。 (./cars减少日产)

  3. 这是我打开CSV文件的方式。

    void main(int argc, char *argv[]) {
    
    FILE *in = fopen ("Cars.csv" ,"rt");
    
    if (in == NULL) { 
      fclose (in); return 0; 
    }
    

    //我需要将CSV文件中的数据存储在指针数组中。我知道该怎么做,但我在没有逗号的情况下存储它们时遇到问题,然后在第1部分做我需要做的事。

    //这是我能为第二部分编写的唯一代码。

    int p =0;
    for(p =0; p<; p = p + 4) {
    
    
    if(strcmp(argsv[2],save[p]) == 0) {  //save is the array of pointers where I 
       int r = int(save[p +1]);           //store the data from the csv file
       int s = r - 1;
       char str[15];
       sprintf(str, "%d", s);
       save[p +1] = str; // not sure if this line actually makes sense
    }
    }
    

2 个答案:

答案 0 :(得分:2)

有几种可能的解决方案。

这是一个:

  1. 将行读入指针数组。使用malloc分配数组,并根据需要使用realloc重新分配。使用fgets读取行。

  2. 对于每一行,使用strtok分割行,并为每个字段执行所需操作。

  3. 另一种解决方案:

    使用您最喜欢的搜索引擎搜索现有的CSV阅读库(有很多可以处理非常高级的CSV文件)。

答案 1 :(得分:0)

考虑如何表示数据并定义结构。

typedef struct {
  char *name;
  int stock; 
  int order;
  double price;
} car_type;

打开文件:参见OP的代码

查找多少行并分配内存

char buf[100];
size_t n = 0;
while (fgets(buf, sizeof buf, in) != NULL) n++;
rewind(in);

car_type *car = malloc(n * sizeof *car);
if (car == NULL) OutOfMemory();

阅读汽车

for (size_t i=0; i<n; i++) {
  if (fgets(buf, sizeof buf, in) == NULL) Handle_UnexpectedEOF();
  char car_name[100];
  if (4 != sscanf(buf, "%s ,%d ,%d, %lf", car_name,
      &car[i].stock, &car[i].order, &car[i].price) Handle_FormatError();
  car[i].name = strdup(car_name);
}

// Use `car` ...

完成后

fclose(in);
for (size_t i=0; i<n; i++) {
  free(car[i].name);
}
free(car);