使用C在csv中的逗号之间加零

时间:2013-12-24 05:44:35

标签: c csv comma

我这里有这个代码:

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

int main()
{
    FILE *inFile, *outFile;
    int i;
    char buffer[1];
    bool lastIsComma = false;

    inFile = fopen("csv.txt","r");
    outFile = fopen("output.txt","w");

    while(!feof(inFile))
    {
        fscanf(inFile,"%c",&buffer);
        i = atoi(buffer);

        if((i!=0) || (*buffer == '0'))
        {
            fprintf(outFile,"%d",i);
            lastIsComma = false;
        }
        else
        {
            if((lastIsComma) && (feof(inFile)))
            {
                fputc('0',outFile);
            }
            if((lastIsComma) && (!feof(inFile)))
            {
                fputc('0',outFile);
                fputc(',',outFile);
            }
            if((!lastIsComma) && (feof(inFile)))
            {
                fputc(',',outFile);
                fputc('0',outFile);
            }
            if((!lastIsComma) && (!feof(inFile)))
            {
                fputc(',',outFile);
            }
            lastIsComma = true;
        }
    }

fclose(inFile);
fclose(outFile);
return 0;
}

这段代码的作用是在csv中的连续逗号之间加零,例如1,2 ,,,, 3, - &gt; 1,2,0,0,0,3,0

我的代码适用于以逗号结尾的csv,如上例所示,但不适用于以值结尾的csv,例如1,2,3,4,5(我得到的是1,2,3,4,55,而不是最后额外的'5'。

有人能说出代码中有什么问题吗?感谢。

2 个答案:

答案 0 :(得分:1)

代码

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

int main(void)
{
    const char *srcStr = "1,2,,,3,4,,,";
    char destStr[100] = {'\0'}, prevCh = '\0';
    int destIdx = 0;

    for(int srcIdx = 0; srcIdx < strlen(srcStr); srcIdx++)
    {
        if(srcStr[srcIdx] != ',')
        {
            destStr[destIdx++] = srcStr[srcIdx];
        }
        else if(prevCh != ',')
        {
            destStr[destIdx++] = srcStr[srcIdx];
        }
        else
        {
            destStr[destIdx++] = '0';
            destStr[destIdx++] = srcStr[srcIdx];
        }

        prevCh = srcStr[srcIdx];
    }

    if(destStr[destIdx - 1] == ',')
        destStr[destIdx] = '0';

    printf("%s\n", srcStr);
    printf("%s\n", destStr);

    system("pause");
    return 0;
}

逻辑

  1. 源字符串和目标字符串需要不同的索引,因为目标字符串的索引在插入'0'时必须递增两次。
  2. 如果当前字符不是',',我们可以将其添加到目标字符串。
  3. 如果当前字符为','但前一个字符不是',',我们可以将','复制到目标字符串。
  4. 如果当前字符为','且前一个字符为',',则必须在目标字符串中插入'0'。我们还需要包含“,'。目标索引必须在此块中递增两次。
  5. 如果目标字符串中插入的最后一个字符是',',请向其添加另一个'0'
  6. 输出

      

    1,2 ,,, 3,4 ,,,
      1,2,0,0,3,4,0,0,0
      按任意键继续 。 。

    重构您的代码

    while((ch = getc(inFile)) != EOF)
    {
        if(ch != ',')
        {
            destStr[destIdx++] = ch;
        }
        else if(prevCh != ',')
        {
            destStr[destIdx++] = ch;
        }
        else
        {
            destStr[destIdx++] = '0';
            destStr[destIdx++] = ch;
        }
    
        prevCh = ch;
    }
    

答案 1 :(得分:0)

重复最后一个数字(即“1,2,3,4,55”)的原因是因为while循环(while(!feof(inFile)))运行一次迭代比实际可用数据多一次文件。

fscanf的返回值(inFile,“%c”和&amp; buffer);可以检查以确保从文件读取的值有效。否则设置为EOF(0xFFFFFFFF)