博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用boost::spirit实现的CSV文件解析类
阅读量:6676 次
发布时间:2019-06-25

本文共 2870 字,大约阅读时间需要 9 分钟。

boost::spirit真是不错的说。。。。


None.gif#include <iostream>
None.gif#include <iterator>
None.gif#include <vector>
None.gif#include <
string>
None.gif
None.gif#include <boost/spirit/core.hpp>
None.gif#include <boost/spirit/iterator/file_iterator.hpp>
None.gif
None.gif
using 
namespace std;
None.gif
using 
namespace boost::spirit;
None.gif
None.giftemplate<typename IteratorT>
None.gif
struct LineInfo 
ExpandedBlockStart.gif {
InBlock.gif    IteratorT lineIter;
InBlock.gif    size_t lineNum;
InBlock.gif
ExpandedSubBlockStart.gif    LineInfo( IteratorT beg ) : lineIter(beg), lineNum(1) { }
ExpandedBlockEnd.gif};
None.gif
None.giftemplate<typename IteratorT>
None.gif
struct NewLine
ExpandedBlockStart.gif {
InBlock.gif    LineInfo<IteratorT>& lineInfo;
ExpandedSubBlockStart.gif    NewLine( LineInfo<IteratorT>& info ) : lineInfo(info) { }
InBlock.gif
InBlock.gif    
void 
operator()(IteratorT first, IteratorT last) 
const
ExpandedSubBlockStart.gif    {
InBlock.gif        lineInfo.lineIter = last;
InBlock.gif        lineInfo.lineNum++;
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif};
None.gif
None.gif
struct AddVal
ExpandedBlockStart.gif {
InBlock.gif    vector<
string>& values;
ExpandedSubBlockStart.gif    AddVal( vector<
string>& vec ) : values(vec) { }
InBlock.gif
InBlock.gif    template<
class IteratorT>
InBlock.gif    
void 
operator()(IteratorT first, IteratorT last) 
const
ExpandedSubBlockStart.gif    {
InBlock.gif#ifdef _MSC_VER
InBlock.gif        
string s;
InBlock.gif        s.resize(distance(first, last));
InBlock.gif        
for (size_t i = 0; first != last; ++i) 
ExpandedSubBlockStart.gif        {
InBlock.gif            s[i] = *first++;
ExpandedSubBlockEnd.gif        }
InBlock.gif
#else
InBlock.gif        
string s( first, last );
InBlock.gif
#endif
InBlock.gif        
string::size_type pos = 0;
InBlock.gif        
while (1)
ExpandedSubBlockStart.gif        {
InBlock.gif            pos = s.find("\"\"", pos);
InBlock.gif            
if (pos == 
string::npos)
InBlock.gif                
break;
InBlock.gif            ++pos;
InBlock.gif            s.erase(pos, 1);
ExpandedSubBlockEnd.gif        }
InBlock.gif        values.push_back(s);
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif};
None.gif
None.giftemplate<
class IteratorT>
None.gif
struct CSVParser : 
public grammar<CSVParser<IteratorT> >
ExpandedBlockStart.gif {
InBlock.gif    vector<
string>& v;
InBlock.gif    LineInfo<IteratorT>& lineInfo;
InBlock.gif
ExpandedSubBlockStart.gif    CSVParser( vector<
string>& vec, LineInfo<IteratorT>& info ) : v(vec), lineInfo(info) { }
InBlock.gif
InBlock.gif    template <typename ScannerT>
InBlock.gif    
struct definition 
ExpandedSubBlockStart.gif    {
InBlock.gif        rule<ScannerT> csv, val, quoted_val, naked_val;
InBlock.gif
InBlock.gif        definition(
const CSVParser<IteratorT>& self)
ExpandedSubBlockStart.gif        {
InBlock.gif            csv = val >> *(',' >> val) >>
InBlock.gif                (eol_p[NewLine<IteratorT>(self.lineInfo)] | end_p);
InBlock.gif
InBlock.gif            val = *blank_p >>
InBlock.gif                ch_p('\"') >> quoted_val[AddVal(self.v)] >> ch_p('\"') >>
InBlock.gif                *blank_p
InBlock.gif                | naked_val[AddVal(self.v)];
InBlock.gif
InBlock.gif            quoted_val = *(eol_p[NewLine<IteratorT>(self.lineInfo)]
InBlock.gif            | ~ch_p('"') | str_p("\"\""));
InBlock.gif
InBlock.gif            naked_val = *(~ch_p(',') & ~ch_p('\"') & ~ch_p('\n'));
ExpandedSubBlockEnd.gif        }
InBlock.gif
ExpandedSubBlockStart.gif        
const rule<ScannerT>& start() 
const { 
return csv; }
ExpandedSubBlockEnd.gif    };
ExpandedBlockEnd.gif};
None.gif
None.giftemplate<typename IteratorT>
None.gifparse_info<IteratorT>
None.gifparse_csv( 
const IteratorT& first, 
const IteratorT& last,
None.gif          vector<
string>& vec, LineInfo<IteratorT>& info )
ExpandedBlockStart.gif {
InBlock.gif    CSVParser<IteratorT> csv(vec, info);
InBlock.gif
InBlock.gif    
return parse(first, last, csv);
ExpandedBlockEnd.gif}
None.gif
None.gif
int main( 
int argc, 
char** argv)
ExpandedBlockStart.gif {
InBlock.gif    
if (argc != 2) 
return 1;
InBlock.gif
InBlock.gif    typedef file_iterator<
char> iterator_t;
InBlock.gif
InBlock.gif    iterator_t begin(argv[1]);
InBlock.gif    
if (!begin)
ExpandedSubBlockStart.gif    {
InBlock.gif        cout << "Unable to open file: " << argv[1] << endl;
InBlock.gif        
return -1;
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    iterator_t first = begin;
InBlock.gif
InBlock.gif    iterator_t last = first.make_end();
InBlock.gif
InBlock.gif    LineInfo<iterator_t> line_info( begin );
InBlock.gif    
while ( first != last )
ExpandedSubBlockStart.gif    {
InBlock.gif        vector<
string> v;
InBlock.gif        parse_info<iterator_t> info = parse_csv( first, last, v, line_info );
InBlock.gif
InBlock.gif        
if (!info.hit)
ExpandedSubBlockStart.gif        {
InBlock.gif            cout << "Error!!  Line: " << line_info.lineNum
InBlock.gif                << ", Column: " << distance(line_info.lineIter, info.stop)+1 << endl;
InBlock.gif            
break;
ExpandedSubBlockEnd.gif        }
InBlock.gif
InBlock.gif        cout << "Parses OK:" << endl;
InBlock.gif        
for (vector<
string>::size_type i = 0; i < v.size(); ++i)
InBlock.gif            cout << i+1 << ": " << v[i] << endl;
InBlock.gif
InBlock.gif        cout << "-------------------------\n";
InBlock.gif
InBlock.gif        first = info.stop;
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    
return 0;
ExpandedBlockEnd.gif}
None.gif

转载地址:http://vpwao.baihongyu.com/

你可能感兴趣的文章
Laravel 中缓存驱动的速度比较
查看>>
C struct 隐藏结构体成员
查看>>
Python中的 sort 和 sorted
查看>>
Ubiquitous Religions-并查集(5)
查看>>
HDU2059:龟兔赛跑(dp)
查看>>
[Unity3D][转] 关于Assets资源目录结构管理
查看>>
【语法】category
查看>>
实验一
查看>>
python 安装pip
查看>>
获得地址栏内的参数
查看>>
影响FPGA设计中时钟因素的探讨【转】
查看>>
make运行阶段划分
查看>>
cpio
查看>>
浅谈深度学习
查看>>
C++异常安全的赋值运算符重载 【微软面试100题 第五十五题】
查看>>
HDU 3535
查看>>
字符串指针
查看>>
ubuntu设置开机启动项
查看>>
进制与进制转换DAY2
查看>>
orcale 之 SQL 数据查询
查看>>