#include <stdio.h>
#define MAX_ITEM_SIZE 100
#define MAX_LINE_SIZE 1024
char *GetCSVItem(char *wp, char *buff, int size);
void main(int argc, char *argv[])
{
FILE *fp;
char buff[MAX_LINE_SIZE], *wp, item[3][MAX_ITEM_SIZE];
int i1, len;
if(argc != 2){
printf("コマンドの入力形式が間違っています.\n");
return;
}
fp = fopen(argv[1], "r");
if(fp == NULL){
printf("ファイルがオープンできません[%s].\n", argv[1]);
return;
}
for(;;){
if(fgets(buff, MAX_LINE_SIZE, fp) == NULL)
break;
len = strlen(buff);
if(len == 0 || buff[len-1] != '\n'){
if(feof(fp) == 0){
printf("データが不正です[%s].\n", buff);
return;
}
}
buff[len-1] = '\0';
wp = buff;
if((wp = GetCSVItem(wp, item[0], MAX_ITEM_SIZE)) == NULL){
printf("エラー(1)\n");
break;
}
if((wp = GetCSVItem(wp, item[1], MAX_ITEM_SIZE)) == NULL){
printf("エラー(2)\n");
break;
}
if((wp = GetCSVItem(wp, item[2], MAX_ITEM_SIZE)) == NULL){
printf("エラー(3)\n");
break;
}
if(*wp != '\0'){
printf("エラー(4)\n");
break;
}
for(i1 = 0; i1 < 3; i1++){
printf("%d:%s\n", i1+1, item[i1]);
}
}
fclose(fp);
}
char *GetCSVItem(char *wp, char *buff, int size)
{
int i1, dq_flag;
dq_flag = 0;
buff[0] = '\0';
while(*wp == ' ' || *wp == '\t')
wp++;
if(*wp == '\0'){
return(NULL);
}
if(*wp == '"'){
dq_flag = 1;
wp++;
}
for(i1 = 0; i1 < MAX_ITEM_SIZE; i1++, wp++){
if(i1 >= size)
return(NULL);
buff[i1] = *wp;
if(*wp == '\0'){
buff[i1] = '\0';
return(wp);
}
if(dq_flag == 1){
if(*wp == '"'){
if(*(wp+1) == '"'){
wp++;
}
else{
wp++;
while(*wp == ' ' || *wp == '\t')
wp++;
if(*wp != ','){
buff[i1] = '\0';
if(*wp == '\0')
return(wp);
return(NULL);
}
wp++;
buff[i1] = '\0';
break;
}
}
}
if(dq_flag == 0 && *wp == ','){
wp++;
buff[i1] = '\0';
break;
}
}
return(wp);
}
|