Strsep,进一步解析CSV输入

时间:2018-01-28 18:09:39

标签: c csv strsep

使用strsep将CSV与一堆无用的垃圾分开(“,”Delim)。其中一个条目在任何一方都有引号(即佛罗里达州,“鲍勃”,1999年),我想在将它们保存到我的阵列之前将它们拉出来。

如何从名称中删除引号?谢谢!

for (int i = 0; i < 19; i++)
{                               
  token = strsep(&copy, ","); //Split token
  if (i ==  3) {one_spot->location = token;}
  if (i == 17) {one_spot->name = token;}//the Name is in quotes in CSV
  if (i == 18) {one_spot->year = atoi(token);}
}
all_spots[j] = one_spot; //Add to array.

1 个答案:

答案 0 :(得分:0)

你可以这样做:

  1. 使用"
  2. 查找第一个strchr
  3. 如果找到,请查找下一个"
  4. 使用memcpy复制引号之间的字符串。
  5. if (i == 17)
    {
        char *firstq = strchr(token, '"');
        if(firstq == NULL)
        {
            one_song->name = strdup(token);
            continue;
        }
    
        char *lastq = strchr(firstq++, '"');
        if(lastq == NULL)
        {
            // does not end in ", copy everything
            one_song->name = strdup(token);
            continue;
        }
    
        size_t len = lastq - firstq;
    
        char *word = calloc(len + 1, 1);
        if(word == NULL)
        {
            // error handling, do not continue
        }
    
        memcpy(word, firstq, len); // do not worry about \0 because of calloc
        one_song->name = word;
    }
    

    请注意,我使用strdup来完成作业one_song->name = strdup(token);calloc分配内存。 strsep返回指向copy + an的指针 偏移。根据您创建/分配copy的方式,此内存可能是 函数退出后无效。这就是为什么创建一个副本更好的原因 在将其分配给结构之前的原始文件。

    这段代码非常简单,它不处理开头和结尾的空格 字符串。它可以区分abc"abc",但它失败了 "abc"d"abc"def"。它也不处理转义引号等。此代码仅显示从引号中提取字符串的方法。为你编写练习不是我的工作,但我可以告诉你如何开始。