对csv文件处理,出现的问题,求解

小人物一样开心 2014-02-24 12:25:39
代码如下:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define MAX_LINE_SIZE 1024

struct Resolution{
int n;
char *Vector[4];

};
struct Resolution *Re;



int main()
{
int n=5;
int m=4,i,j=0;

int iloop;
char strLine[MAX_LINE_SIZE];
FILE *fp;

fp=fopen("data.csv","r");
Re=(struct Resolution *)malloc(n*sizeof(struct Resolution)); //分配空间
//memset(Re, 0, sizeof(struct Resolution)*n);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
Re[i].Vector[j]=(char*)malloc(sizeof(100)); //分配空间
for (iloop = 0; iloop <n; iloop++)
{
if (fgets(strLine, MAX_LINE_SIZE, fp))
{

sscanf(strLine, "%[^,],%[^,],%[^,],%s",Re[iloop].Vector[0],Re[iloop].Vector[1],Re[iloop].Vector[2],Re[iloop].Vector[3]);
}

}


for (i=0;i<n;i++) //查看结果
{
for ( j=0;j<m;j++)
{
printf("%s ", Re[i].Vector[j]);
}
printf("\n");
}


for(i=0;i<n;i++)
for(j=0;j<m;j++)
free( Re[i].Vector[j]);
free(Re);
}


csv文件如下:

***,19850101,黄岛开发区香江路110号高科 技创业中心303室行政部 青岛恩格维管理咨询有限公司, F
***,19850101,龙文区蓝田工业开发区纵一路胜 裕制衣财务部 漳州胜裕制衣有限公司, F
***,19850101,浙江省永康市西溪镇上塘头村169号, F
***,19850101,闸北区阳曲路668号319室 , F
***,19850101,哈尔滨市道外区东直路234号, F

出现错误:
*** Error in `./a.out': free(): invalid next size (fast): 0x09a041f8 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x767e2)[0xb76397e2]
/lib/i386-linux-gnu/libc.so.6(+0x77530)[0xb763a530]
./a.out[0x80488f2]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0xb75dc935]
./a.out[0x80485a1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:07 15498 /home/ly/readcsv/SupportStruct_v1/a.out
08049000-0804a000 r--p 00000000 08:07 15498 /home/ly/readcsv/SupportStruct_v1/a.out
0804a000-0804b000 rw-p 00001000 08:07 15498 /home/ly/readcsv/SupportStruct_v1/a.out
09a04000-09a25000 rw-p 00000000 00:00 0 [heap]
b758c000-b75a7000 r-xp 00000000 08:07 787294 /lib/i386-linux-gnu/libgcc_s.so.1
b75a7000-b75a8000 r--p 0001a000 08:07 787294 /lib/i386-linux-gnu/libgcc_s.so.1
b75a8000-b75a9000 rw-p 0001b000 08:07 787294 /lib/i386-linux-gnu/libgcc_s.so.1
b75c2000-b75c3000 rw-p 00000000 00:00 0
b75c3000-b7771000 r-xp 00000000 08:07 806775 /lib/i386-linux-gnu/libc-2.17.so
b7771000-b7773000 r--p 001ae000 08:07 806775 /lib/i386-linux-gnu/libc-2.17.so
b7773000-b7774000 rw-p 001b0000 08:07 806775 /lib/i386-linux-gnu/libc-2.17.so
b7774000-b7777000 rw-p 00000000 00:00 0
b778d000-b7792000 rw-p 00000000 00:00 0
b7792000-b7793000 r-xp 00000000 00:00 0 [vdso]
b7793000-b77b3000 r-xp 00000000 08:07 806776 /lib/i386-linux-gnu/ld-2.17.so
b77b3000-b77b4000 r--p 0001f000 08:07 806776 /lib/i386-linux-gnu/ld-2.17.so
b77b4000-b77b5000 rw-p 00020000 08:07 806776 /lib/i386-linux-gnu/ld-2.17.so
bffbd000-bffde000 rw-p 00000000 00:00 0 [stack]
已放弃 (核心已转储)


并且:有乱码如下
*** 19850101 黄岛开发区F F
*** 19850101 龙文区蓝田F F
*** 19850101 浙江省永康F F
*** 19850101 闸北区阳曲F F
*** 19850101 哈尔滨市道F F

第三列有乱码用cat ,more显示也是乱码。一定不是编码的问题,前两天也出现了乱码但是当时cat,more能够正常显示,而vi出现乱码,通过对vi进行配置,已成功显示,所以可以确定是程序问题,而且对大csv文件处理时,通过编写的另一个程序已实现。
...全文
260 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
N_Sev7 2014-02-27
  • 打赏
  • 举报
回复
提示你Free()了无效地址 应该是访问越界 我一般处理CSV文件都会先把文件后缀改为.txt,然后再处理
赵4老师 2014-02-27
  • 打赏
  • 举报
回复
RFC 4180 Common Format and MIME Type for CSV Files October 2005
q342362859 2014-02-26
  • 打赏
  • 举报
回复
回收空间的时候出错。仔细检查分配的空间
luobinshan 2014-02-26
  • 打赏
  • 举报
回复
自己写解析可能会漏掉很多转义, 建议参考开源项目libcsv.
赵4老师 2014-02-24
  • 打赏
  • 举报
回复
//处理CSV格式文件,需要读取一个CSV文件,文件按照逗号进行分割。
//但是有些值中存在逗号,比如
//State Corporation Executives,"Vice President, Nordic Investment Bank",,,2006……
//每行60列
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#define MAXF 60    //每行最多列数
#define MAXC 80    //每列最多字符数+1
#define MAXW 4862  //每行最多字符数
#define MAXL 10000 //文件中最多行数
char D[MAXL][MAXF][MAXC];
char ln[MAXW];
int s,i,n,L;
char c,*p;
FILE *f;
int main() {
    setlocale(LC_ALL,"chs");
    f=fopen("d.csv","r");
    if (NULL==f) {
        fprintf(stderr,"无法打开文件d.csv!\n");
        return 1;
    }
    L=0;
    while (1) {
        if (NULL==fgets(ln,MAXW,f)) break;
        if ('\n'!=ln[strlen(ln)-1]) {
            fprintf(stderr,"第%d行太长(>%d个字符)!",L+1,MAXW);
            fclose(f);
            return 1;
        }
        ln[strlen(ln)-1]=0;
        s=0;
        i=0;
        n=0;
        p=ln;
        while (1) {
            c=ln[i];
            switch (s) {
            case 0://开始
                if (c==0) goto SHOW;
                if (c=='\"') {
                    s=1;
                    p=ln+i;
                } else if (c==',') {
                    strncpy(D[L][n],p,__min((ln+i)-p,MAXC-1));D[L][n][MAXC-1]=0;
                    n++;
                    if (n>=MAXF) {
                        fprintf(stderr,"警告:第%d行多于%d的字段被忽略。\n",L+1,MAXF);
                        goto SHOW;
                    }
                    p=ln+i+1;
                    s=3;
                } else {
                    s=2;
                    p=ln+i;
                }
            break;
            case 1://双引号中
                if (c==0) {
                    fprintf(stderr,"第%d行第%d个字符处格式错误!期望双引号。\n",L+1,i);
                    fclose(f);
                    return 1;
                }
                if (c=='\"' && (ln[i+1]==',' || ln[i+1]==0)) {
                    strncpy(D[L][n],p,__min((ln+i)-p+1,MAXC-1));D[L][n][MAXC-1]=0;
                    n++;
                    if (n>=MAXF) {
                        fprintf(stderr,"警告:第%d行多于%d的字段被忽略。\n",L+1,MAXF);
                        goto SHOW;
                    }
                    if (ln[i+1]==0) goto SHOW;
                    if (ln[i+1]==',') {
                        i++;
                        p=ln+i+1;
                        s=3;
                    }
                }
                if (c=='\"' && !(ln[i+1]==',' || ln[i+1]==0)) {
                    fprintf(stderr,"第%d行第%d个字符处格式错误!期望逗号或行结束。\n",L+1,i+1);
                    fclose(f);
                    return 1;
                }
            break;
            case 2://非双引号中
                if (c==0) {
                    strncpy(D[L][n],p,__min((ln+i)-p,MAXC-1));D[L][n][MAXC-1]=0;
                    n++;
                    goto SHOW;
                }
                if (c=='\"') {
                    fprintf(stderr,"第%d行第%d个字符处格式错误!此处不应出现双引号。\n",L+1,i);
                    fclose(f);
                    return 1;
                }
                if (c==',') {
                    strncpy(D[L][n],p,__min((ln+i)-p,MAXC-1));D[L][n][MAXC-1]=0;
                    n++;
                    if (n>=MAXF) {
                        fprintf(stderr,"警告:第%d行多于%d的字段被忽略。\n",L+1,MAXF);
                        goto SHOW;
                    }
                    p=ln+i+1;
                    s=3;
                }
            break;
            case 3://逗号后
                if (c==0) {
                    strncpy(D[L][n],p,__min((ln+i)-p,MAXC-1));D[L][n][MAXC-1]=0;
                    n++;
                    goto SHOW;
                }
                if (c=='\"') {
                    s=1;
                    p=ln+i;
                } else if (c==',') {
                    strncpy(D[L][n],p,__min((ln+i)-p,MAXC-1));D[L][n][MAXC-1]=0;
                    n++;
                    if (n>=MAXF) {
                        fprintf(stderr,"警告:第%d行多于%d的字段被忽略。\n",L+1,MAXF);
                        goto SHOW;
                    }
                    p=ln+i+1;
                } else {
                    s=2;
                    p=ln+i;
                }
            break;
            }
            i++;
        }
    SHOW:
        if (n!=MAXF) fprintf(stderr,"警告:第%d行数据列数%d不等于%d!\n",L+1,n,MAXF);
        printf("第%d行%d列:",L+1,n);
        for (i=0;i<n;i++) {
            if (i<n-1) printf("[%s]," ,D[L][i]);
            else       printf("[%s]\n",D[L][i]);
        }
        L++;
        if (L>=MAXL) {
            fprintf(stderr,"警告:多于%d行的数据被忽略。\n",MAXL);
            break;
        }
    }
    fclose(f);
    return 0;
}
//警告:第1行数据列数5不等于60!
//第1行5列:[State Corporation Executives],["Vice President, Nordic Investment Bank"],[],[],[2006……]

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧