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

    技术2022-05-19  29

    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[=], iLen[=]/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[=], iStart[=], iLen[=], ", 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; }


    最新回复(0)