从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中的行读取值时丢失字符串中的最后一个字符的主要内容,如果未能解决你的问题,请参考以下文章
从 qml 中的 .txt 或 .csv 文件中读取一行(Qt Quick)
Pyspark 的 sqlContext.read.csv() 函数读取的行数比实际 .csv 文件中的行数多
php 使用SplFileObject读取CSV文件。从CSV文件定义标题或管理标题行。返回数组中的行,标题值为