C语言一次性读取多个CSV表格



#include <stdlib.h>
#include<stdio.h>
#include <iostream>
using namespace std;


//=================================================================================
//path: the path of CSV file
//arr2: the data of CSV saved in arr2
//the memory of arr2 is not malloc()ed in my_ReadSingleCSV(),
//thus,the function that call my_ReadSingleCSV() must malloc() memory for arr2
//ROWS: total rows of CSV sheets
//COLS: total columns of CSV sheets
void my_ReadSingleCSV(char *path, double **arr2, int ROWS, int COLS)
{
    FILE *fp = NULL;
    fp = fopen(path, "at+");
    if ( NULL == fp )
    {
            cout << "Failed to open " << path << endl;
    }


    char d;
    int ret=1;
    int i = 0;

    while ( ret != EOF && i < ROWS )
    {
    	for(int j=0; j<COLS; j++)
    	{

            ret = fscanf( fp, "%lf", &arr2[i][j]);
            ret = fscanf( fp, ",", &d);

    	}

    	i++;
    }
    fclose(fp);

}


//=================================================================================
//paths: the path of all CSV sheets in paths
//arr3D: the data of all CSV sheets saved in arr3D
//the memory of arr3D is not malloc()ed in my_ReadMultiCSV(),
//thus,the function that call my_ReadSingleCSV() must malloc() memory for arr3D
//NUMS: the number of CSV sheets to be read
//ROWS: total rows of every CSV sheets
//COLS: total columns of every CSV sheets
void my_ReadMultiCSV(char ** paths, double ***arr3D, int NUMS, int ROWS, int COLS)
{

	for(int n=0; n<NUMS; n++)
	{
		char path[260];
		strcpy(path, paths[n]);
		my_ReadSingleCSV(path, arr3D[n], ROWS, COLS);
	}

}

//=================================================================================
//we have malloc() contiguous memory chunks for arr3D in my_ReadingMultiCSV()
//thus, in function that call my_ReadingMultiCSV(), we just do
//double ***DatasAllCSV = my_ReadingMultiCSV(NUMS, ROWS, COLS);
double *** my_ReadingMultiCSV(int NUMS, int ROWS, int COLS)
{

	//*------------------------ set paths  ------------------------------*//
	char *paths1D;
	paths1D = (char *)malloc( NUMS*260*sizeof(char) );
	char **paths2D;
	paths2D = (char **)malloc(NUMS*sizeof(char *));
	for(int n=0; n<NUMS; n++)
	{
		paths2D[n] = paths1D + n*260;
	}

	strcpy(paths2D[0], "/home/zlf/Documents/code/MTF/MTF_rdc.csv");
	strcpy(paths2D[1], "/home/zlf/Documents/code/MTF/MTF_gdc.csv");
	strcpy(paths2D[2], "/home/zlf/Documents/code/MTF/MTF_bdc.csv");
	strcpy(paths2D[3], "/home/zlf/Documents/code/MTF/MTF_rac.csv");

	//*------------------------ set arr3D  ------------------------------*//
    double * arr1D=NULL;
    arr1D = (double *)malloc( NUMS*ROWS*COLS*sizeof(double) );
    double ** arr2D=NULL;
    arr2D = (double **)malloc(NUMS*ROWS*sizeof(double *));
	for(int dh=0; dh<NUMS*ROWS; dh++)
	{
		arr2D[dh] = arr1D + dh*COLS;
	}

    double *** arr3D=NULL;
    arr3D = (double ***)malloc(NUMS*sizeof(double **));

    for(int d=0; d<NUMS; d++)
    {
    	arr3D[d] = arr2D +d*ROWS;
    }

	my_ReadMultiCSV(paths2D, arr3D, 4, 2, 2);

    return arr3D;

}


//=================================================================================
int  main()
{
	int NUMS=4;
	int ROWS=2;
	int COLS=2;

	double ***DatasAllCSV = my_ReadingMultiCSV(NUMS, ROWS, COLS);

    for(int n=0; n<NUMS; n++)
    {
    	printf("DatasAllCSV[%d]=: \n", n);
    	 for(int r=0; r<ROWS; r++)
    	 {
    		 for(int c=0; c<COLS; c++)
	         {
    			 printf("%f  ",DatasAllCSV[n][r][c]);
	         }
    		 printf("\n");
    	 }
		 printf("\n");
    }

	return 0;

}









运行结果:


DatasAllCSV[0]=: 
1.000000  2.000000  
2.000000  4.000000  

DatasAllCSV[1]=: 
2.000000  4.000000  
4.000000  8.000000  

DatasAllCSV[2]=: 
3.000000  6.000000  
6.000000  12.000000  

DatasAllCSV[3]=: 
4.000000  8.000000  
8.000000  16.000000  






            









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值