C语言读取CSV文件到二维数组

csv文件如下
ROI,Frame,Wavelength,Row,Column,Intensity
1,1,510.03628334677774,0,0,1411
1,1,510.24679860984367,0,1,1082
1,1,510.45730951036455,0,2,1148
1,1,510.6678160483404,0,3,1129
1,1,510.8783182237712,0,4,1101
1,1,511.08881603665691,0,5,1145
1,1,511.29930948699757,0,6,1133
...
其中,Row,Column,Intensity列分别为y(0到399),x(0到1399),和对应位置的值
想用C读取这个文件中的数据,存入一个400*1400的二维数组(即在数组中的位置由Row,Column确定,对应的值为Intensity),方便后面的处理和运算
应该怎样读取?

C小白求助,谢谢大家!

#include<stdio.h>
#include <stdlib.h>
short int z[400][1400]; // 数组较大,可用short就不要用long

FILE *fin;
int i,j,v,k; // 频繁读写使用的量,声明为全局量
char *buff;

main(){
buff = (char*) malloc(sizeof(char)*100);

// 打开文件

if ((fin=fopen("Derenity.csv","r"))==NULL){
printf("\aopen file err\n");
return 1;
}

fgets(buff,100,fin); // 跳过第一行
while(1){
if (fgets(buff,100,fin)!=NULL){
sscanf(buff,"%*d,%*d,%*lf,%d,%d,%d",&j,&i,&v); // 只读每行有用的j,i,z[j][i],其它跳过
z[j][i]=v; // 存放
} else break;
}
fclose(fin);

printf("%d",z[0][4]); // 校对1个z[j][i]
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-11-12
#include<stdio.h>
#include<malloc.h>
void main()
{

FILE *fp_CVS;
int x,y,n_Intensity;
double d;
int temp;

/*栈空间不足,需要使用堆空间构造二维数组*/
int **n_Intensitys = (int **)malloc(1400*sizeof(int *));
for (int i = 0; i < 1400; i++) {
n_Intensitys[i] = (int *)malloc(400*sizeof(int));
}
/*假设文件是1.cvs位于E盘*/
fp_CVS = fopen("E:\\1.cvs","r");
while (EOF != fscanf(fp_CVS,"%d,%d,%lf,%d,%d,%d",&temp,&temp,&d,&y,&x,&n_Intensity)) {
if ((x >= 0 && x <= 1399)&& (y >= 0 && y <= 399)) {
n_Intensitys[x][y] = n_Intensity;
printf("%d,%d,%d ",x,y,n_Intensitys[x][y]);
}
}

fclose(fp_CVS);

/*记得用free释放二维数组,此处不累述*/
}本回答被提问者采纳
第2个回答  2013-02-19
这个程序的关键部分是读每一行中,

由逗号分隔的各个字段,也即token.
对每一行,把每个字段逐一取出,然后想用就用,不用丢弃.----这个思路,应该是既单纯,又比较优雅吧.
为此,为你单独写了这一思路的实现及相关测试,
代码如下:
---------------------------------------opstring.c
int get_next_token_CLangVersion
( const char* from , //0218,13
char* token, char token_seper )
{
static char* from_old = 0 ;
static int fromidx = 0;
char c ;
//init for new begin
if (from != from_old )
{ from_old = from ;
fromidx = 0 ;
}

//init for next new token
*token = 0 ;

//check --can be getting ?
if (fromidx == -1) return -1;

//get token
//get a char from "from", then get again
while ( (c=*(from+fromidx++))
!= 0 && c != token_seper )
*(token++) = c ;

//get done
if ( c== 0) fromidx = -1 ;
if ( c== token_seper)
{/*do nothing .
fromidx恰好已指向下一个token之起始位置*/
}
*token = 0; //token结束
return 0 ;
}

-------------------------------------------------test.c

#include <stdio.h>
#include "opstring.h"
void main ()
{
char token[100] ;
char s[1024] ;
int ret = 0;

scanf ( "%s", s) ;
*token = '#';
for ( ; ret != -1;)
{ printf ("token--%s--\n", token) ;
ret = get_next_token_CLangVersion (s, token, ',') ;
}
}
/*
23,,,3444444443lld,,4444444444444444,266,d,,fddd3-,
token--#--
token--23--
token----
token----
token--3444444443lld--
token----
token--4444444444444444--
token--266--
token--d--
token----
token--fddd3---
token----
*/

-------------------------------------------opstring.h
int get_next_token_CLangVersion ( const char* from ,char* token, char token_seper ) ;

该实现在Borland C++ 5.6.4 for Win32 环境下,测试通过.

该实现是可复用的哟.祝你好运.
关键部分解决了,其它部分对你而言,应该是小菜一碟吧呵,我想.^_^
第3个回答  推荐于2016-11-25
二维数组,用std::vector<std::vector<int> > data ;
参考代码如下:
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
p=s;
while (1) {
k=sscanf(p,"%d%n",&v,&n);
printf("k,v,n=%d,%d,%d\n",k,v,n);
if (1==k) {
p+=n;
} else if (0==k) {
printf("skip char[%c]\n",p[0]);
p++;
} else {//EOF==k
break;
}
}
printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.
相似回答