从 CSV 文件读取并用“;”解决问题
Reading from a CSV file and solving problems with ";"
我有这个 CSV 文件,我必须读取它并打印每个不同的客户(每一行都是一个客户)
IDClient;Name;Surname;Address;City;State;Postal_Code
111A;Howard;Snyder;2732 Baker Blvd.;Eugene;OR;97403
222B;Yoshi;Latimer;City Center Plaza 516 Main St.;Elgin;OR;97827
333C;John;Steel;12 Orchestra Terrace;Walla Walla;WA;99362
444D;Jaime;Yorres;87 Polk St. Suite 5;San Francisco;CA;94117
我写了这段代码,尽管有一些警告似乎工作正常,除了 ;
的一些问题
int main(int argc, char const *argv[])
{
FILE *fp;
fp = fopen ("clientes.txt", "rt");
if (fp == NULL) {
printf("Error.\n");
}
else {
printf("File is open\n");
printCustomers(fp);
fclose(fp);
}
return 0;
}
void printCustomers (FILE *fp)
{
char id[5], first [8], last [10], adress[17], city[12], state[3], zip[6];
printf("Printing.\n");
fscanf(fp, "%*[^\n]\n", NULL); //Skip first line
printf("-----------------------\n");
while (fscanf(fp,"%4s %7s %9s %16[^\n] %11[^\n] %2s %5s", &id, &first, &last, &adress, &city, &state, &zip) == 7)
{
printf("IdClient: %s\nName: %s\nSurname: %s\nAdress: %s\nCity: %s\nState: %s\nZip: %s\n", id, first, last, adress, city, state, zip);
printf("-----------------------\n");
}
}
我的输出是这样的,正如您所看到的 ;
正在破坏输出。我认为这可以通过 fscanf 格式解决,但我不知道该怎么做。
-----------------------
IdClient: 111A
Name: ;Howard
Surname: ;Snyder;2
Adress: 732 Baker Blvd.;
City: Eugene;OR;9
State: 74
Zip: 03
-----------------------
IdClient: 222B
Name: ;Yoshi;
Surname: Latimer;C
Adress: ity Center Plaza
City: 516 Main St
State: .;
Zip: Elgin
-----------------------
IdClient: ;OR;
Name: 97827
Surname: 333C;John
Adress: ;Steel;12 Orches
City: tra Terrace
State: ;W
Zip: alla
-----------------------
IdClient: Wall
Name: a;WA;99
Surname: 362
Adress: 444D;Jaime;Yorre
City: s;87 Polk S
State: t.
Zip: Suite
----------------------
如果我没有很好地解释自己或遗漏了什么,请告诉我。
每个客户的输出必须是这样的,也许我当前的 fscanf 有点难以达到这个,因为并非每个客户的所有字段都具有相同的长度:
-----------------------
IdClient: 111A
Name: Howard
Surname: Snyder
Adress: 2732 Baker Blvd.
City: Eugene
State: OR
Zip: 97403
-----------------------
您可以更改密码
fscanf(fp,"%4s %7s %9s %16[^\n] %11[^\n] %2s %5s",...
到风格
fscanf(fp,"%4s;%7[^;];%10[^;];......
将 ;
作为 格式字符串的一部分 。那么它将不会被视为 字符串输入的一部分 .
注意:上述方法只是一个变通方法,如果更改格式,很容易出错。建议以更稳健的方式实现相同目的的通用方法:
我有这个 CSV 文件,我必须读取它并打印每个不同的客户(每一行都是一个客户)
IDClient;Name;Surname;Address;City;State;Postal_Code
111A;Howard;Snyder;2732 Baker Blvd.;Eugene;OR;97403
222B;Yoshi;Latimer;City Center Plaza 516 Main St.;Elgin;OR;97827
333C;John;Steel;12 Orchestra Terrace;Walla Walla;WA;99362
444D;Jaime;Yorres;87 Polk St. Suite 5;San Francisco;CA;94117
我写了这段代码,尽管有一些警告似乎工作正常,除了 ;
int main(int argc, char const *argv[])
{
FILE *fp;
fp = fopen ("clientes.txt", "rt");
if (fp == NULL) {
printf("Error.\n");
}
else {
printf("File is open\n");
printCustomers(fp);
fclose(fp);
}
return 0;
}
void printCustomers (FILE *fp)
{
char id[5], first [8], last [10], adress[17], city[12], state[3], zip[6];
printf("Printing.\n");
fscanf(fp, "%*[^\n]\n", NULL); //Skip first line
printf("-----------------------\n");
while (fscanf(fp,"%4s %7s %9s %16[^\n] %11[^\n] %2s %5s", &id, &first, &last, &adress, &city, &state, &zip) == 7)
{
printf("IdClient: %s\nName: %s\nSurname: %s\nAdress: %s\nCity: %s\nState: %s\nZip: %s\n", id, first, last, adress, city, state, zip);
printf("-----------------------\n");
}
}
我的输出是这样的,正如您所看到的 ;
正在破坏输出。我认为这可以通过 fscanf 格式解决,但我不知道该怎么做。
-----------------------
IdClient: 111A
Name: ;Howard
Surname: ;Snyder;2
Adress: 732 Baker Blvd.;
City: Eugene;OR;9
State: 74
Zip: 03
-----------------------
IdClient: 222B
Name: ;Yoshi;
Surname: Latimer;C
Adress: ity Center Plaza
City: 516 Main St
State: .;
Zip: Elgin
-----------------------
IdClient: ;OR;
Name: 97827
Surname: 333C;John
Adress: ;Steel;12 Orches
City: tra Terrace
State: ;W
Zip: alla
-----------------------
IdClient: Wall
Name: a;WA;99
Surname: 362
Adress: 444D;Jaime;Yorre
City: s;87 Polk S
State: t.
Zip: Suite
----------------------
如果我没有很好地解释自己或遗漏了什么,请告诉我。
每个客户的输出必须是这样的,也许我当前的 fscanf 有点难以达到这个,因为并非每个客户的所有字段都具有相同的长度:
-----------------------
IdClient: 111A
Name: Howard
Surname: Snyder
Adress: 2732 Baker Blvd.
City: Eugene
State: OR
Zip: 97403
-----------------------
您可以更改密码
fscanf(fp,"%4s %7s %9s %16[^\n] %11[^\n] %2s %5s",...
到风格
fscanf(fp,"%4s;%7[^;];%10[^;];......
将 ;
作为 格式字符串的一部分 。那么它将不会被视为 字符串输入的一部分 .
注意:上述方法只是一个变通方法,如果更改格式,很容易出错。建议以更稳健的方式实现相同目的的通用方法: