从CSV中的行读取值时丢失字符串中的最后一个字符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从CSV中的行读取值时丢失字符串中的最后一个字符相关的知识,希望对你有一定的参考价值。

我正在尝试解析一行CSV文件并提取出我想要的值。但是,我的功能是切断字符串中的最后一个字符,我无法弄清楚原因。我认为它与我分配空终止符的位置有关,但改变它没有帮助。任何帮助,将不胜感激。谢谢!

char* findKey(char lineBuffer[], int columnNumber ){
    char tempArray[strlen(lineBuffer)+2];
    int commasCounted = 0;
    int i =0;

    for(i = 0; i < strlen(lineBuffer) - 1; i++){
        if (commasCounted == columnNumber){
            commasCounted = i;
            break;
        }

        if (lineBuffer[i] == '\"'){
            i++;
            while(lineBuffer[i] && lineBuffer[i] != '\"'){
                i++;
            }
        }

        if (lineBuffer[i] == ','){
            commasCounted++;
        }
    }

    if(lineBuffer[commasCounted] == ','){
        tempArray[0] = '0';
        tempArray[1] = '0';
        tempArray[2] = '0';
        tempArray[3] = '0';
        tempArray[4] = '\0';
    }else{
        int j = 0;
        for(i = commasCounted; i < strlen(lineBuffer) - 1; i++){
            if(lineBuffer[i] == '\"'){
                i++;
                while(lineBuffer[i] && lineBuffer[i] != '\"'){
                    tempArray[j] = lineBuffer[i];
                    i++;
                    j++;
                }
                break;
            }else if(lineBuffer[i] == ','){
                break;
            }else
                tempArray[j] = lineBuffer[i];
                j++;
        }
        tempArray[j] = '\0';
    }

    char* tempString = strtok(tempArray, "\n");
    //printf("tempString before returning in findKey: %s\n", tempString); //testing
    return tempString;
}

CSV文件可以将某些列包装在引号中,这就是为什么在那里有一些引号检查的原因。这将传递要检查的字符串以及保存信息的列。所以,例如:传递给lineBuffer:

30,beforeyoustartedgackinyouusedtohaveabrainbutnowyoudontgeteventhesimpliesofthingsdrawalittlepictureevenusemyhandstrytoexplainbutyoujustdontunderstandoh

而对于columnNumber则为1

返回的结果如下:

beforeyoustartedgackinyouusedtohaveabrainbutnowyoudontgeteventhesimpliesofthingsdrawalittlepictureevenusemyhandstrytoexplainbutyoujustdontunderstando
答案

你永远不会复制该行的最后一个字符,因为你在i < strlen(lineBuffer) - 1循环条件中有for。改为i < strlen(lineBuffer)

你还需要在返回之前复制字符串,你不能在C中返回一个本地数组:

return strdup(tempString);

这也意味着调用者需要在完成后释放该字符串,因为strdup()会动态分配内存。或者,你可以使用malloc()来首先分配tempArray(),而不是声明一个本地数组。

以上是关于从CSV中的行读取值时丢失字符串中的最后一个字符的主要内容,如果未能解决你的问题,请参考以下文章

确定从 Access 数据库读入的字符串中的行数

从 qml 中的 .txt 或 .csv 文件中读取一行(Qt Quick)

Pyspark 的 sqlContext.read.csv() 函数读取的行数比实际 .csv 文件中的行数多

php 使用SplFileObject读取CSV文件。从CSV文件定义标题或管理标题行。返回数组中的行,标题值为

使用 С# CSVHELPER 从 CSV 获取值时,代码重复

如何从csv文件中读取python中的数字?