在C中解析.csv文件时出现问题,我不知道';我不知道如何告诉我的程序&引用;等于“a”\";
我目前在一家主机业务的技术支持部门工作,使用Primary cPanel。此外,我正在学习如何编写代码(目前仅使用C)。问题是,我在解析由cPanel创建的csv文件时遇到了问题,这是一个包含所有域信息(Ip、域名、磁盘可用空间等)的列表。到目前为止,我成功解析的所有文件(.txt、.csv、.bin等)都有一行新行,由一个?endofline分隔?(\n在C中,我不知道其他名称如何称为:P),但在这个特定的文件中,一行的结尾由“,,,”分隔,如下所示: 域名,ip,配额,,,,域名,ip,配额,,,域名,ip,配额,,,ip,配额 我不知道如何告诉我的程序“,,,,”等于“\n”。到目前为止,我只能读取文件中的第一个域,但这是它返回的唯一记录。目前的守则如下:在C中解析.csv文件时出现问题,我不知道';我不知道如何告诉我的程序&引用;等于“a”\";,c,csv,parsing,C,Csv,Parsing,我目前在一家主机业务的技术支持部门工作,使用Primary cPanel。此外,我正在学习如何编写代码(目前仅使用C)。问题是,我在解析由cPanel创建的csv文件时遇到了问题,这是一个包含所有域信息(Ip、域名、磁盘可用空间等)的列表。到目前为止,我成功解析的所有文件(.txt、.csv、.bin等)都有一行新行,由一个?endofline分隔?(\n在C中,我不知道其他名称如何称为:P),但在这个特定的文件中,一行的结尾由“,,,”分隔,如下所示: 域名,ip,配额,,,,域名,ip,配额
void parsear_archivo(ArrayList* lista)
{
FILE* archivo = abrir_archivo("archivo.csv");
eDominio* aux;
char aux_ip[100];
char aux_nombre_dominio[200];
char aux_user_name[50];
char aux_email[100];
char aux_quota[100];
char aux_server[100];
rewind(archivo);
fscanf(archivo, "%[^,],%[^,],%[^,],%[^\n]\n", aux_nombre_dominio, aux_ip, aux_email,aux_server);
while (!feof(archivo))
{
aux = constructor();
fscanf(archivo, "%[^,],%[^,],%[^,],%[^\n]\n", aux_nombre_dominio, aux_ip, aux_email,aux_server);
if (aux != NULL)
{
strcpy(aux->ip, aux_ip);
strcpy(aux->quota, aux_quota);
strcpy(aux->server, aux_server);
strcpy(aux->email, aux_email);
strcpy(aux->nombre_dominio, aux_nombre_dominio);
}
lista->add(lista, aux);
}
fclose(archivo);
}
对代码的几点评论:我正在使用ArrayList将文件加载到内存中,该文件已经过测试,因此我知道它工作正常;函数constructor()和abrir_archivo()不是这里的问题(我在其他项目中多次使用它们,没有问题-当然,constructor()函数是根据我当前使用的特定结构定制的-)
我对正则表达式了解不多,我知道我现在使用的正则表达式在第一个“,”出现之前一直在文件中读取,但仅此而已
任何帮助都将不胜感激
感谢您并为糟糕的英语感到抱歉。如果您将
%[^\n]\n
更改为[^,],,,,
,会发生什么情况?所有转换必须至少匹配一个字符。格式字符串中只有空格表示数据中的可选空格,这仅在转换规范不跳过空格时才相关(即%c
,%[…]
和%n
;其他所有内容都跳过前导空格)。因此,您无法将CSV行末尾的、、、
与转换匹配,例如%[^、%[^、]、%[^、]、%[^、]、%[^、]、
(在第四个匹配的逗号之后可能有也可能没有另一个%[^、]
)。在这一点上,您意识到无论是scanf()
系列还是strok()
都不是一个好主意。