`
7090
  • 浏览: 280345 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

c++解析csv文件

 
阅读更多
针对unix跟windows平台,换行符不同,造成的问题,对csv解析进行了一些修改。。。


/**
 *  解析完的数据放到data这个二维数组中,通过getData(int rows,int cols)
 *  获取数据
 **/

#ifndef _CSVPARSE_
#define _CSVPARSE_

#include "cocos2d.h"
#include <stdio.h>
#include <iostream>
#include <fstream>

class CSVParse {
    
public:
    CSVParse(istream& fin = cin, string sep = ","):
    fieldsep(sep),
    cols(0)
    {}
    ~CSVParse();
private:
    string                      fieldsep;        // separator characters
    vector<vector<string> >     data;
    int                         cols;
    
private:    
    void    split(vector<string>& field,string line);
    int     advplain(const string& line, string& fld, int);
    int     advquoted(const string& line, string& fld, int);
    
public: 
    //打开文件
    bool            openFile(const char* fileName);
    bool            openFile2(const char* fileName);
    //根据行列获取数据
    const   char*   getData(int rows,int cols);
    //该列是否有此数据
    int             findColsData(int cols,const char* value);
    //得到最大的列数
    inline  int     getCols(){return cols;}
    //得到总共的行数
    inline  int     getRows(){return data.size();}
};

#endif
#endif



#include "CSVParse.h"

using namespace cocos2d;


CSVParse::~CSVParse()
{
    for (int i=0; i<data.size(); i++) {
        data[i].clear();
    }
    data.clear();
}

// split: split line into fields
void CSVParse::split(vector<string>& field,string line)
{
    string fld;
    int i, j;
    
    if (line.length() == 0)
        return ;
    i = 0;
    
    do {
        if (i < line.length() && line[i] == '"')
            j = advquoted(line, fld, ++i);    // skip quote
        else
            j = advplain(line, fld, i);

        field.push_back(fld);
        i = j + 1;
    } while (j < line.length());
    
}

// advquoted: quoted field; return index of next separator
int CSVParse::advquoted(const string& s, string& fld, int i)
{
    int j;
    
    fld = "";
    for (j = i; j < s.length(); j++)
    {
        if (s[j] == '"' && s[++j] != '"')
        {
            int k = s.find_first_of(fieldsep, j);
            if (k > s.length())    // no separator found
                k = s.length();
            for (k -= j; k-- > 0; )
                fld += s[j++];
            break;
        }
        fld += s[j];
    }
    return j;
}

// advplain: unquoted field; return index of next separator
int CSVParse::advplain(const string& s, string& fld, int i)
{
    int j;
    
    j = s.find_first_of(fieldsep, i); // look for separator
    if (j > s.length())               // none found
        j = s.length();
    fld = string(s, i, j-i);
    return j;
}


// getfield: return n-th field
const char* CSVParse::getData(int rows,int cols)
{
    if (rows<0||rows>=data.size()||cols<0||cols>=data[rows].size()) {
        return "";
    }
    
    return data[rows][cols].c_str();
}

int  CSVParse::findColsData(int cols,const char* value)
{
    for (int i=0; i<data.size(); i++) {
        if (strcmp(getData(i, cols), value)==0 )
        {
            return i;
        }
    }
    return -1;
}
//用于兼容windows下的换行符\r\n
//原因是在windows下换行符为\r\n,而在unix下则为\n
//进行封装,否则读取的每行读取的最后一个数据默认会有个额外的\r
bool getline(std::ifstream &is,std::string &str){
	bool b = std::getline(is,str);
	std::string::size_type p = str.find_last_of('\r');
	if(p != std::string::npos) str.erase(p);
	return b;
}

//读取方式: 逐行读取, 将行读入字符串, 行之间用回车换行区分
//If you want to avoid reading into character arrays, 
//you can use the C++ string getline() function to read lines into strings
bool CSVParse::openFile(const char* fileName)
{
    string pathKey = CCFileUtils::fullPathFromRelativePath(fileName);
    ifstream fin(pathKey.c_str());  
    string s;  
    
    while(::getline(fin,s))
    {   
        CCLOG("%s",s.c_str());
        vector<string> field;
        split(field,s);
        data.push_back(field);
        cols=max(cols, (int)field.size());
    }
    
    for (int i=0; i<data.size(); i++) {
        for (int k=0; k<data[i].size(); k++) {
            CCLOG("%s",getData(i, k));
        }
        
    }
    
    return true;
}

//该方法可用于anroid跟ios及windows平台

bool CSVParse::openFile2(const char* fileName)
{

const char* xmlConfFullPath = CCFileUtils::fullPathFromRelativePath(fileName);    

	CCFileData csvdata(xmlConfFullPath, "rt");
	unsigned long size = csvdata.getSize();

	char *pBuffer = (char*) csvdata.getBuffer();

   string  stringData(pBuffer);

	stringstream  strm;

	strm.write(pBuffer, size);


	string s;  

    while(::getline(fin,s))
    {   
        CCLOG("%s",s.c_str());
        vector<string> field;
        split(field,s);
        data.push_back(field);
        cols=max(cols, (int)field.size());
    }
    
    for (int i=0; i<data.size(); i++) {
        for (int k=0; k<data[i].size(); k++) {
            CCLOG("%s",getData(i, k));
        }
        
    }
    
    return true;
}


参考:http://www.cnblogs.com/JCSU/articles/1190685.html
http://www.cnblogs.com/huoguofeng/archive/2010/11/24/1887087.html

分享到:
评论

相关推荐

    c++语言CSV文件分割解析

    使用c++开发的csv文件解析类。 namespace cpp { namespace str { /** 高性能的 csv 解析 */ class csv_parser { public: typedef std::pair, size_t &gt; string_t; typedef std::vector&lt;string_t &gt; fields_t; ...

    c++csv文件解析

    总的来说,C++解析CSV文件涉及文件I/O、字符串处理、容器操作等多个核心概念。选择合适的解析方法取决于具体需求,包括性能、易用性、可维护性和灵活性。理解这些基本概念并结合C++强大的编程工具,能帮助开发者有效...

    c++读取csv文件数据

    c++读取csv数据并存储到数组中。csv数据可以为一行多列也可以为多行一列。

    c++读取csv文件

    本文档将详细讲解如何在Visual Studio 2013环境下使用C++语言读取CSV文件,并通过动态分配数组来存储读取到的数据。 首先,我们需要包含必要的头文件,以便使用文件流操作。在C++中,`&lt;fstream&gt;`头文件提供了处理...

    Qt解析CSV文件

    在描述中提到的"CSVparser类"可能是项目中自定义的一个类,用于读取和解析CSV文件。通常,这个类会逐行读取文件,然后根据逗号分隔符分割每一行,将数据存储在某种结构(如QStringList或std::vector)中。 接下来,...

    C++读写CSV文件

    本篇文章将详细介绍如何利用C++标准模板库(STL)中的`vector`容器来读取和写入CSV文件。 ### CSV文件的基本概念 CSV文件是由逗号分隔的一系列数据,每一行代表一个记录,每一列代表一个字段。这样的结构使得CSV...

    linux c++csv文件读写

    CSV文件是一种常见的数据存储格式,通常用于数据交换,因为它的结构简单且易于解析。以下将详细介绍如何在C++中进行Linux平台上的CSV文件读写。 一、CSV文件读取 1. **标准库iostream** 使用`ifstream`类可以...

    C++读取csv到数组.zip

    在本教程中,我们将探讨如何使用C++和标准库中的`std::ifstream`、`std::getline`以及`std::stringstream`来高效地读取CSV文件,并将数据存储到`std::vector`容器中。 首先,我们需要包含必要的头文件: ```cpp #...

    C++读取CSV文件

    本篇文章将深入探讨如何使用纯C++来读取CSV文件,不依赖任何第三方库,同时会提供一个简单的CSVReader类设计及其使用示例。 首先,理解CSV文件的结构至关重要。CSV文件由一行行的数据组成,每行数据由逗号分隔,每...

    c++的csv文件读写

    本文将详细讲解如何在C++环境下,特别是在Visual C++ 2005(VC2005)中进行CSV文件的读写操作。 CSV文件的核心特点是用逗号分隔各个字段,每一行代表一条记录,每条记录由一个或多个字段组成。在C++中,我们可以...

    C++对文件排序并输出CSV文件

    在C++编程中,对文件中的数据进行排序并输出到CSV文件是一项常见的任务,尤其在数据分析、报表生成或数据处理的场景下。本项目提供的功能实现了这一需求,具有良好的代码可读性和实用性。下面我们将详细探讨相关的...

    c++实现的读写csv文件

    本篇文章将深入探讨如何使用C++来读取和写入CSV文件,以实现数据的导入和导出功能。 首先,理解CSV文件的基本结构至关重要。CSV文件由行组成,每行包含一个或多个字段,字段之间通过逗号分隔。在某些情况下,如果...

    c++实现csv读写

    本教程将详细介绍如何使用C++来实现CSV文件的读取和写入操作。 首先,我们需要理解C++的标准库并不直接支持CSV处理,但我们可以利用文件流(fstream)类来读写文件,并结合字符串处理函数实现对CSV的解析和生成。...

    CDataFile_demo.zip_C csv 数据_C++读取csv数据_C++读取csv文件_csv read_csv

    C++作为一种强大的编程语言,提供了多种方式来读取和处理CSV文件。本示例"CDataFile_demo.zip"包含了一个C++实现的CSV阅读器,帮助开发者轻松地读取和存储CSV文件中的数字数据。 首先,我们来看标题"CSVFile_demo....

    C++读写.csv文件

    本教程将详细解释如何使用C++实现.csv文件的读写功能,以及如何解决在处理中文路径时可能遇到的问题。 首先,让我们了解一下.csv文件的结构。这种文件格式以纯文本形式存储表格数据,每一行代表一行记录,列之间以...

    解析CSV文件工具

    虽然这个实现较为基础,但它展示了手动解析CSV文件的基本思路。 标签“源码”和“工具”暗示了本文可能会涉及编写自己的CSV处理代码或者讨论现有的CSV处理工具。无论是编写自己的解析器还是利用现有库,理解CSV文件...

    CSV文件格式解析器

    本项目实现了一个基于C++的CSV文件解析器,采用有限状态机(Finite State Machine, FSM)的设计模式。有限状态机是一种计算模型,用于描述和设计具有固定数量状态的系统,这些状态可以根据特定输入进行转换。在CSV...

    C++csv文件数据读取

    综上所述,C++中读取CSV文件涉及文件流操作、字符串处理和数据解析等技术,而在惯性导航数据处理中,还需要理解传感器数据的特性,以及如何有效地对这些数据进行分析和计算。通过结合`fstream`、`sstream`等工具,...

    C++读取CSV表格

    C++作为一种强大的系统级编程语言,虽然没有内置的CSV处理库,但可以通过自定义函数或使用第三方库来实现CSV文件的读取。本文将详细讲解如何在C++中读取CSV表格。 首先,我们需要理解CSV文件的基本结构。每行代表一...

    CSV文件读取类C++源代码

    在C++中,我们可以利用标准库中的`fstream`来处理文件操作,结合字符串处理函数来解析CSV内容。下面是一个基本的CSV文件读取类的设计思路: 1. **类定义**:创建一个名为`CSVReader`的类,包含以下成员: - `...

Global site tag (gtag.js) - Google Analytics