读取C中的csv文件,字符串中有逗号



我有一个以逗号作为分隔符的csv文件,但里面有带逗号的字符串值,所以mi代码也将其分隔为


char buffer[1024];
int row = 0;
int column = 0;
while (fgets(buffer,1024, fp)) {
column = 0;
row++;

if (row == 1)
continue;

char* value = strtok(buffer, ",");
while (value) {
if (column == 0) {
printf("Titulo :");
}
if (column == 1) {
printf("tAutor :");
}
if (column == 2) {
printf("tanio :");
}
if (column == 3) {
printf("testante_numero :");
}
if (column == 4) {
printf("testante_seccion :");
}
if (column == 5) {
printf("tpiso :");
}
if (column == 6) {
printf("tedificio :");
}
if (column == 7) {
printf("tsede :");
}
printf("%s", value);
value = strtok(NULL, ",");
column++;
}
printf("n");
}
// Close the file
fclose(fp);

csv文件的一行示例:"计算机程序的结构和解释"Abelson、Sussman和Sussman";,1996,4;Lenguajes de Programacion";,2;B"Vina del Mar">

我的输出:蒂图洛:";计算机程序的结构和解释";Autor:";Abelson anio:Sussman estante_numero:和Sussman";estante_ccion:1996 piso:4启发:";Lenguajes de Programacion";sede:2〃;B"Vina del Mar">

如何修复我的代码?

CSV文件中的字段用逗号分隔,记录用换行符终止。因此,我们的想法是逐行读取文件,识别分隔逗号,但忽略嵌入的逗号。

下面的例子并不是一个完美的解决方案,它将实现CSV特定的所有规则,而是一个如何使用所提供的信息解析文件的例子。

如果文件包含头行,则可以读取每个字段名并将其存储在字符串数组中,以获得更通用的方法。此外,如果需要对数据进行一些进一步的操作(可能是排序(,则可以使用结构。

其中包括一些说明代码的注释。

#include <stdio.h>
#include <stdlib.h>
#define BUFF_SIZE 1024
#define NR_FIELDS 8
int main(void)
{
char buffer[BUFF_SIZE];
char *field[NR_FIELDS] = {"Titulo", "Autor", "Anio", "Estante numero", "Estante seccion", "Piso", "Edificio", "Sede"};
char *pos, *lastPos;
FILE *fp = fopen("file.csv", "r");
if (fp == NULL)
{
printf("Error opening the file.");
exit(1);
}
// read each line to a buffer
while (fgets(buffer, BUFF_SIZE, fp) != NULL) 
{
int i = 0;
_Bool inString = 0;
pos = lastPos = buffer;
/* read characters from the buffer. If " is read, consider it beginning of the 
string and ignore subsequent commas, until second " is read */
do 
{
if (*pos == '"')
inString = !inString;
/* if ',' is read or the end of the line is reached, while not inside a string, 
consider it a field delimiter and print the field, preceded by field name */
if ((*pos == ',' || (*pos == '' && i == NR_FIELDS - 1)) && !inString)
{
printf("%s: %.*s", field[i++], pos - lastPos, lastPos);
if (*pos)
// add space between the fields if not at the end of the line
printf(" ");
lastPos = pos + 1;
}
} while (*pos++ && i < NR_FIELDS);
} 
fclose(fp);
return 0;
}  

相关内容

  • 没有找到相关文章

最新更新