【问题标题】:Strsep, Parsing CSV Input furtherStrsep,进一步解析 CSV 输入
【发布时间】:2018-07-07 11:11:23
【问题描述】:

使用 strsep 拆分包含一堆无用垃圾的 CSV ("," Delim)。其中一个条目的两边都有引号(即 Florida,"Bob",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.

【问题讨论】:

  • 你有什么问题?
  • 首先,您真的不应该尝试制作自己的 CSV 解析器。虽然它可能看起来简单而微不足道,但有很多角落和特殊情况并非易事。例如,双引号的存在表明它可以是包含空格和其他特殊字符的任意字符串,包括逗号
  • 至于您的问题,请记住,C 字符串基本上只是一个带有特殊终止符的数组。现在如果你把这个终止符放在字符串的中间会发生什么?如果你得到一个指向字符串中第二个字符的指针会发生什么?想一想,做一些实验。

标签: c csv strsep


【解决方案1】:

你可以这样做:

  1. 使用strchr 查找第一个"
  2. 如果找到,查找下一个"
  3. 使用memcpy 复制引号之间的字符串。

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-&gt;name = strdup(token);calloc 分配内存。 strsep 返回指向 copy 的指针 + 一个 抵消。根据您创建/分配copy 的方式,此内存可能是 函数退出后无效。这就是为什么最好创建一个副本 将其分配给结构之前的原始内容。

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

【讨论】:

    猜你喜欢
    • 2017-01-14
    • 2010-11-29
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多