您的位置:首页 > 编程语言

解析csv格式文件的一段C代码

2011-03-04 12:41 696 查看
CSV逗号分隔值文件(Comma Separated value),是一种用来存储数据的纯文本文件格式,通常用于电子表格或数据库软件。

维基词条:

英文 http://en.wikipedia.org/wiki/Comma-separated_values

中文 http://zh.wikipedia.org/wiki/CSV

自写的一段解析csv格式文件的代码,供参考:

#include <stdio.h>
#include <stdlib.h>
int	f3(int argc, char **argv);
int main(int argc, char **argv)
{
f3(argc, argv);
}
int f3(int argc, char *argv[])
{
char	sFilename[100+1];
FILE	*fp;
char	sLine[1000+1];
int	i=0;
int iFlg=0;	//0-无左引号 1-有左引号
char	sLine2[1000+1];
char	sField[100+1];
int iStart=0;
int iLen=0;
memset(sFilename, 0, sizeof(sFilename));
strcpy(sFilename, argv[1]);
if(strlen(sFilename) == 0)
{
strcpy(sFilename, "test.csv");
}
printf("sFilename[%s]/n", sFilename);
fp = fopen(sFilename, "r");
if(fp == NULL)
{
printf("fopen error/n");
return -1;
}
memset(sLine, 0, sizeof(sLine));
memset(sLine2, 0, sizeof(sLine2));
while(fgets(sLine, sizeof(sLine)-1, fp) != NULL)
{
//去掉行尾的换行符
sLine[strlen(sLine)-2] = 0;
sLine[strlen(sLine)-1] = 0;
printf("-----------------------------------------/n");
printf("sLine[%s]/n", sLine);

//赋值第一个field的开始
iStart = 0;
//重置第一个field的长度
iLen = 0;

for(i=0; i<=strlen(sLine); i++)
{
//printf("c[%c], iStart[%3d], iLen[%3d]/n", sLine[i], iStart, iLen);
if(sLine[i]=='"')
{
if(iFlg == 0)	//遇到field的左边界(双引号开始)
{
iFlg = 1;
}
else	//遇到field的右边界或field中的双引号
{
if(sLine[i+1] != '"')	//如果下一个字符不是双引号,则遇到field的右边界
{
iFlg = 0;
}
else	//如果下一个字符是双引号,则是field中的双引号
{
//跳过下一个双引号不处理
i++;
//累计field的长度
iLen++;
}
}
}
//printf("{%c %d}", sLine[i], iFlg);
//遇到逗号且不在双引号内,或遇到结束符时
if((sLine[i] == ',' && iFlg != 1) || sLine[i] == '/0')
{
//获取field值
memset(sField, 0, sizeof(sField));
memcpy(sField, sLine+iStart, iLen);
printf("/ni[%3d], iStart[%3d], iLen[%3d], ", i, iStart, iLen);
printf("sField[%s] --> ", sField);

//把连续两个双引号替换成一个双引号
iReplaceStr(sField, "/"/"", "/"");

//删除逗号(用于金额域)
//iDelStr(sField, ",");

printf("[%s]/n", sField);

//处理field的值
//your code here...

//赋值下一个field的开始
iStart = i+1;

//重置下一个field的长度
iLen = 0;
}
else
{
//累计field的长度
iLen ++;
}
}
}
fclose(fp);
return 0;
}
/* 功能:删除字符串s1里的字符串s2,改变字符串s1
返回:0 成功,-1 失败
*/
int iDelStr(char *s1, char *s2)
{
char *p;

if(strlen(s1) <= 0 || strlen(s2) <= 0)
{
return -1;
}

while((p = strstr(s1, s2)) != NULL)
{
strcpy(p, p+strlen(s2));
}
return 0;
}
/* 功能:把字符串s1里的字符串s2,替换成s3,改变字符串s1,
s3的长度必须比s2小,以防s1溢出
返回:0 成功,-1 失败
*/
int iReplaceStr(char *s1, char *s2, char *s3)
{
char *p;
if(strlen(s1) <= 0 || strlen(s2) <= 0 || strlen(s3) <= 0)
{
return -1;
}
if(strlen(s3) > strlen(s2))
{
return -1;
}
while((p = strstr(s1, s2)) != NULL)
{
memcpy(p, s3, strlen(s3));
strcpy(p+strlen(s3), p+strlen(s2));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: