C++ 把数组数据存入 CSV 文件,以及读取 CSV 文件的数据

1. CSV-百度百科

2. 代码

#pragma once

//Microsoft Visual Studio 2015 Enterprise

#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>

using namespace std;

template<typename base_T>
class modifyCSVfile
{
private:
    struct arrInfo
    {
        double **arrName;
        int lineNum;
        int rowNum;
    };
public:
    string saveArray(base_T* arr, int lineNum, int rowNum, string fileName, int precis = 6);
    string saveArray(const vector<vector<base_T>>& arr, string fileName, int precis = 6);
    vector<vector<double>> CSVtoVector(string fileName);
    arrInfo CSVtoArray(string fileName);
    int delArray(arrInfo);
};

//*************************************************************************************************************************************************************
//*************************************************************************************************************************************************************
template<typename base_T>
string modifyCSVfile<base_T>::saveArray(base_T* arr, int lineNum, int rowNum, string fileName, int precis)
//函数功能:把一个int/float/double型二维数组,存入CSV文件
//参数1:数组第一个元素地址,e.g.【&array1[0][0]】;参数2:数组行数;参数3:数组列数;参数4:文件名;参数5:设置精度(默认精度是6)
{
    fileName += ".csv";    //保存成VSV格式文件,方便用Excel打开

                           //保存数组到文件。如果文件不存在,创建文件,并写入数据;如果文件存在,清空重新写入
    ofstream fout;
    fout.open(fileName.c_str(), ios_base::trunc);
    fout << showpoint;
    fout.precision(precis);
    for (int i = 0; i < lineNum; i++)
    {
        for (int j = 0; j < rowNum; j++)
        {
            if (j < rowNum - 1)
                fout << *(arr + i * rowNum + j) << ",";        // arr + i * rowNum + j:找到当前数组元素的顺序索引值
            else
                fout << *(arr + i * rowNum + j) << endl;
        }
    }
    fout.close();
    return fileName;
}

////用法示例:Visual Studio 2017 Community
//#include<iostream>
//#include<fstream>
//#include<string>
//#include<vector>
//#include"modifyCSVfile.h"
//
//const int arr_lineNum = 5;
//const int arr_rowNum = 7;
//int main()
//{
//    //定义一个double型二维数组,并赋值
//    double k = 1.1;
//    double arr[arr_lineNum][arr_rowNum];
//    for (int i = 0; i < arr_lineNum; i++)
//    {
//        for (int j = 0; j < arr_rowNum; j++)
//        {
//            arr[i][j] = k;
//            k = k + 1;
//        }
//    }
//
//    //输出当前数组到屏幕
//    for (int i = 0; i < arr_lineNum; i++)
//    {
//        for (int j = 0; j < arr_rowNum; j++)
//        {
//            cout << arr[i][j] << " ";
//        }
//        cout << endl;
//    }
//    system("pause");
//
//    //把当前数组存如文件。文件位置:当前工程文件夹下。文件格式为.csv,可用文本文档打开,也可用Excel打开。
//    modifyCSVfile<double> save;
//    save.saveArray(&arr[0][0], arr_lineNum, arr_rowNum, "arr1", 6);
//
//    return 0;
//}

//*************************************************************************************************************************************************************
//*************************************************************************************************************************************************************
template<typename base_T>
string modifyCSVfile<base_T>::saveArray(const vector<vector<base_T>>& arr, string fileName, int precis)
//函数功能:把一个vector二维数组,存入CSV文件
//参数1:vector对象名;参数2:文件名;参数3:设置精度(默认精度是6)
{
    fileName += ".csv";    //保存成VSV格式文件,方便用Excel打开

                           //保存数组到文件。如果文件不存在,创建文件,并写入数据;如果文件存在,清空重新写入
    ofstream fout;
    fout.open(fileName.c_str(), ios_base::trunc);
    fout << showpoint;
    fout.precision(precis);
    for (unsigned int i = 0; i < arr.size(); i++)
    {
        for (unsigned int j = 0; j < arr[i].size(); j++)
        {
            if (j <  arr[i].size() - 1)
                fout << arr[i][j] << ",";
            else
                fout << arr[i][j] << endl;
        }
    }
    fout.close();
    return fileName;
}

////用法示例:Visual Studio 2017 Community
//#include<iostream>
//#include<fstream>
//#include<string>
//#include<vector>
//#include"modifyCSVfile.h"
//
//int main()
//{
//    //定义一个二维vector数组,并赋值
//    double k = 1.1;
//    int lineNum = 5, rowNum = 7;
//    vector<vector<double> > arr2(lineNum, vector<double>(rowNum));
//    for (int i = 0; i < lineNum; i++)
//    {
//        for (int j = 0; j < rowNum; j++)
//        {
//            arr2[i][j] = k;
//            k = k + 1;
//        }
//    }
//
//    //输出当前数组到屏幕
//    for (int i = 0; i < lineNum; i++)
//    {
//        for (int j = 0; j < rowNum; j++)
//            cout << arr2[i][j] << " ";
//        cout << endl;
//    }
//    system("pause");
//
//    //把当前数组存如文件。文件位置:当前工程文件夹下。文件格式为.csv,可用文本文档打开,也可用Excel打开。
//    modifyCSVfile<double> save;
//    save.saveArray(arr2, "arr2", 6);
//
//    return    0;
//}

//*************************************************************************************************************************************************************
//*************************************************************************************************************************************************************
template<typename base_T>
vector<vector<double>> modifyCSVfile<base_T>::CSVtoVector(string fileName)
//函数功能:读取只包含数据不包含文字的CSV文件,并取出里边的数据存入到二维double型vector数组中
//参数1:文件名
{
    fileName += ".csv";
    ifstream fin;
    fin.open(fileName.c_str(), ios_base::in);        //以只读的方式打开文件

                                                     //跳过CSV文件开头可能出现的空行
    char ch;
    while (fin.get(ch))
    {
        if (ch == '\n')
            continue;
        else
            break;
    }
    streamoff pos = fin.tellg();            //保存当前位置
    fin.seekg(pos - 1, ios_base::beg);        //返回到文件中有数据开始的那一行的首位

                                              //获取CSV文件中数据的行数
    int lineNum = 0, rowNum = 0;
    string buf;
    while (getline(fin, buf) && !buf.empty())
    {
        lineNum = lineNum + 1;
    }
    fin.clear();        //getline()读取到文件尾,接下来输入流被阻断。需要重置输入流,如果不重置,接下来将无法获取文件数据。

                        //获取CSV文件中数据的列数
    fin.seekg(pos - 1, ios_base::beg);        //返回到文件中有数据开始的那一行的首位
    while (fin.get(ch))
    {
        if (ch == ',')
        {
            rowNum = rowNum + 1;
        }
        else
            if (ch == '\n')
                break;
    }
    rowNum = rowNum + 1;

    //把CSV文件中的数据存入double型的vector中
    fin.seekg(pos - 1, ios_base::beg);        //返回到文件中有数据开始的那一行的首位
    buf.erase(0);
    double temp;
    vector<vector<double>>vect(lineNum, vector<double>(rowNum));
    for (int i = 0; i < lineNum; i++)
    {
        for (int j = 0; j < rowNum; j++)
        {
            while (fin.get(ch))
            {
                if (ch != ',' && ch != '\n')
                    buf += ch;
                else
                {
                    temp = atof(buf.c_str());
                    vect[i][j] = temp;
                    buf.erase(0);
                    break;
                }
            }
        }
    }
    fin.close();

    return vect;
}

////用法示例:Visual Studio 2017 Community
//#include<iostream>
//#include<fstream>
//#include<string>
//#include<vector>
//#include<cstdio>
//#include<cstdlib>
//#include"modifyCSVfile.h"
//
//using namespace std;
//
//int main()
//{
//
//    vector<vector<double>> arr1;        //创建一个二维vector数组,用于接受函数调用返回的二维vector数组
//    modifyCSVfile<double> read;
//    arr1 = read.CSVtoVector("arr2");
//
//    //输出arr1到屏幕
//    for (int i = 0; i < 4; i++)
//    {
//        for (int j = 0; j < 4; j++)
//        {
//            cout << arr1[i][j] << " ";
//        }
//        cout << endl;
//    }
//
//    system("pause");
//    return    0;
//}

//*************************************************************************************************************************************************************
//*************************************************************************************************************************************************************
template<typename base_T>
typename modifyCSVfile<base_T>::arrInfo modifyCSVfile<base_T>::CSVtoArray(string fileName)
//函数功能:读取只包含数据不包含文字的CSV文件,并取出里边的数据存入到new创建的动态二维数组中
//参数1:文件名
{
    fileName += ".csv";
    ifstream fin;
    fin.open(fileName.c_str(), ios_base::in);        //以只读的方式打开文件

                                                     //跳过CSV文件开头可能出现的空行
    char ch;
    while (fin.get(ch))
    {
        if (ch == '\n')
            continue;
        else
            break;
    }
    streamoff pos = fin.tellg();            //保存当前位置
    fin.seekg(pos - 1, ios_base::beg);        //返回到文件中有数据开始的那一行的首位

                                              //获取CSV文件中数据的行数
    int lineNum = 0, rowNum = 0;
    string buf;
    while (getline(fin, buf) && !buf.empty())
    {
        lineNum = lineNum + 1;
    }
    fin.clear();        //getline()读取到文件尾,接下来输入流被阻断。需要重置输入流,如果不重置,接下来将无法获取文件数据。

                        //获取CSV文件中数据的列数
    fin.seekg(pos - 1, ios_base::beg);        //返回到文件中有数据开始的那一行的首位
    while (fin.get(ch))
    {
        if (ch == ',')
        {
            rowNum = rowNum + 1;
        }
        else
            if (ch == '\n')
                break;
    }
    rowNum = rowNum + 1;

    //new创建二维动态数组
    double **arr = new double *[lineNum];
    for (int i = 0; i < lineNum; i++)
    {
        arr[i] = new double[rowNum];
    }

    //把CSV文件中的数据存入二维数组中
    fin.seekg(pos - 1, ios_base::beg);        //返回到文件中有数据开始的那一行的首位
    buf.erase(0);
    double temp;
    for (int i = 0; i < lineNum; i++)
    {
        for (int j = 0; j < rowNum; j++)
        {
            while (fin.get(ch))
            {
                if (ch != ',' && ch != '\n')
                    buf += ch;
                else
                {
                    temp = atof(buf.c_str());
                    arr[i][j] = temp;
                    buf.erase(0);
                    break;
                }
            }
        }
    }
    fin.close();

    //创建一个结构对象,保存:指向当前数组的指针、当前数组行数、当前数组列数
    arrInfo info;
    info.arrName = arr;
    info.lineNum = lineNum;
    info.rowNum = rowNum;

    return info;        //返回结构
}

////用法示例:Visual Studio 2017 Community
//#include<iostream>
//#include<fstream>
//#include<string>
//#include<vector>
//#include<cstdio>
//#include<cstdlib>
//#include"modifyCSVfile.h"
//
//using namespace std;
//
//int main()
//{
//    //读取CSV文件arr2中的数据,返回一个结构。结构包括:指向数组的指针、数组行数、数组列数
//    modifyCSVfile<double> read;
//    auto arr1 = read.CSVtoArray("arr2");
//
//    //输出数组数据到屏幕
//    for (int i = 0; i < arr1.lineNum; i++)
//    {
//        for (int j = 0; j < arr1.rowNum; j++)
//        {
//            cout << arr1.arrName[i][j] << " ";
//        }
//        cout << endl;
//    }
//
//    //注意:由于调用CSVtoArray函数时,生成的数组是用new分配的,所以数据用完之后要记得释放。
//    //这里没有释放,可以调用delArray函数释放。
//
//    system("pause");
//    return    0;
//}

//*************************************************************************************************************************************************************
//*************************************************************************************************************************************************************
template<typename base_T>
int modifyCSVfile<base_T>::delArray(arrInfo info)
//函数功能:删除调用CSVtoArray函数时生成的动态二维数组
//由于CSVtoArray函数里边的二维数组是使用new创建的,所以用完之后要释放
{
    for (int i = 0; i < info.lineNum; i++)
        delete[] info.arrName[i];
    delete[] info.arrName;

    return 0;
}

////用法示例:Visual Studio 2017 Community
//#include<iostream>
//#include<fstream>
//#include<string>
//#include<vector>
//#include<cstdio>
//#include<cstdlib>
//#include"modifyCSVfile.h"
//
//using namespace std;
//
//int main()
//{
//    //读取CSV文件arr2中的数据,返回一个结构。结构包括:指向数组的指针、数组行数、数组列数
//    modifyCSVfile<double> read;
//    auto arr1 = read.CSVtoArray("arr2");
//
//    //输出数组数据到屏幕
//    for (int i = 0; i < arr1.lineNum; i++)
//    {
//        for (int j = 0; j < arr1.rowNum; j++)
//        {
//            cout << arr1.arrName[i][j] << " ";
//        }
//        cout << endl;
//    }
//
//    //释放调用CSVtoArray函数时用new生成的动态二维数组
//    modifyCSVfile<double> del;
//    del.delArray(arr1);
//
//    system("pause");
//    return    0;
//}


未完 ......

点击访问原文(进入后根据右侧标签,快速定位到本文)

原文地址:https://www.cnblogs.com/sinicheveen/p/12009847.html

时间: 2024-12-20 19:10:20

C++ 把数组数据存入 CSV 文件,以及读取 CSV 文件的数据的相关文章

c文件二进制读取写入文件、c语言实现二进制(01)转化成txt格式文本、c读取文件名可变

c语言实现二进制(01)转化成txt格式文本: 下面的程序只能实现ascall对应字符转换,如果文件内出现中文字符,则会出现错误. 本程序要自己创建个文本格式的输入文件a1.txt,编译后能将文本文件前255字节以内的字符转换成相应的AscII码值的二进制表示,并存入输出文件a2.txt中.然后再将二进制文件还原并存入b2.txt文件. 参考链接:https://www.jb51.net/article/158695.htm 1 #include <cstdio> 2 #include <

【文件】读取一个文件夹下所有的jpg图片

今天做视频处理的时候,发现给的视频是用jpg图片的形式给出的,名字的命名规律性不是很强.就想找一种通用的遍历文件夹下图片的方法. 开始在网上找到了下面这份代码,发现只能读取所有的文件夹,文件都被跳过了 后来发现,原来是判断的if语句出了问题.dwFileAttributes有很多种属性如: FILE_ATTRIBUTE_ARCHIVE FILE_ATTRIBUTE_COMPRESSED FILE_ATTRIBUTE_DIRECTORY FILE_ATTRIBUTE_HIDDEN FILE_ATT

使用Pull解析器生成XML文件和读取xml文件

有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器. 一.布局界面 [html] view plaincopyprint? <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

通过文件路径读取CSV表格内的数据

ReadDataFromCSV.h UCLASS() class MYPROJECT_API UReadDataFromCSV : public UBlueprintFunctionLibrary { GENERATED_BODY() public: UFUNCTION(BlueprintCallable, Category = "CSV") static TArray<FString> GetCSVDataToString(FString csvPath); }; Rea

Node.js——fs模块(文件系统),创建、删除目录(文件),读取写入文件流

1 /* 2 1. fs.stat 检测是文件还是目录(目录 文件是否存在) 3 2. fs.mkdir 创建目录 (创建之前先判断是否存在) 4 3. fs.writeFile 写入文件(文件不存在就创建,但不能创建目录) 5 4. fs.appendFile 写入追加文件 6 5. fs.readFile 读取文件 7 6. fs.readdir 读取目录 8 7. fs.rename 重命名 9 8. fs.rmdir 删除目录 10 9. fs.unlink 删除文件 11 */ 12

java的JFileChooser上传一个Excel文件并读取该文件的内容

一.描述 无论是jsp中还是swing中的上传文件组件都可能上传一个Excel文件并且按行读取文件的记录,读取记录后可以提供数据的显示功能,也可以构造sql语句进行数据库中数据的查询等. 例如我们上传一份用户名单,其中包括用户姓名,性别和身份证号,我们将用户真实姓名加上身份证后四位作为用户账号查询数据库中是否有该用户信息,上传的表格如下: 二.所需工具 java要调用Excel并且读取Excel文件中的数据,就必须使用jxl.jar札包,所以先获取该札包然后引入到java项目中. 该札包的免费下

java读取 500M 以上文件,java读取大文件

java 读取txt,java读取大文件 设置缓存大小BUFFER_SIZE ,Config.tempdatafile是文件地址 来源博客http://yijianfengvip.blog.163.com/blog/static/175273432201191354043148/ package com.yjf.util;import java.io.File;import java.io.RandomAccessFile;import java.nio.MappedByteBuffer;imp

Linux c 从文件当中读取任意一行的数据

代码如下 #include <stdio.h>#include <stdlib.h>#include <sys/stat.h>#include <sys/types.h>#include <string.h>#include <fcntl.h>#define FILEBUFFER_LENGTH 5000#define EMPTY_STR " //打开fileName指定的文件,从中读取第lineNumber行//返回值:成功

spring 框架的xml文件如何读取properties文件数据

第一步:在spring配置文件中 注意:value可以多配置几个properties文件 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>/db.

[How to]如何自定义plist文件和读取plist文件内容

1.简介 plist作为IOS的固化文件,就好比java中properties文件,但是在IOS中plist是可读写的. 本文将介绍自定义静态的plist文件. 2.自定义静态plist文件 右击你的目的文件夹,然后选择[New File....]进行如下选择: 我们创建了一个goods的plist文件,它的默认内容是: 我们预计他是包含一个团购的cell内容,包含上平图片.名称.价格和当前购买人数 他是一个以数组,元素为字典类型,字典中以保存图片.名称.价格和当前购买人数信息: 可以如下定义: