• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            使用boost::spirit實現的CSV文件解析類

            boost::spirit真是不錯的說。。。。

            #include <iostream>
            #include 
            <iterator>
            #include 
            <vector>
            #include 
            <string>

            #include 
            <boost/spirit/core.hpp>
            #include 
            <boost/spirit/iterator/file_iterator.hpp>

            using namespace std;
            using namespace boost::spirit;

            template
            <typename IteratorT>
            struct LineInfo 
            {
                IteratorT lineIter;
                size_t lineNum;

                LineInfo( IteratorT beg ) : lineIter(beg), lineNum(
            1{ }
            }
            ;

            template
            <typename IteratorT>
            struct NewLine
            {
                LineInfo
            <IteratorT>& lineInfo;
                NewLine( LineInfo
            <IteratorT>& info ) : lineInfo(info) { }

                
            void operator()(IteratorT first, IteratorT last) const
                
            {
                    lineInfo.lineIter 
            = last;
                    lineInfo.lineNum
            ++;
                }

            }
            ;

            struct AddVal
            {
                vector
            <string>& values;
                AddVal( vector
            <string>& vec ) : values(vec) { }

                template
            <class IteratorT>
                
            void operator()(IteratorT first, IteratorT last) const
                
            {
            #ifdef _MSC_VER
                    
            string s;
                    s.resize(distance(first, last));
                    
            for (size_t i = 0; first != last; ++i) 
                    
            {
                        s[i] 
            = *first++;
                    }

            #else
                    
            string s( first, last );
            #endif
                    
            string::size_type pos = 0;
                    
            while (1)
                    
            {
                        pos 
            = s.find("\"\"", pos);
                        
            if (pos == string::npos)
                            
            break;
                        
            ++pos;
                        s.erase(pos, 
            1);
                    }

                    values.push_back(s);
                }

            }
            ;

            template
            <class IteratorT>
            struct CSVParser : public grammar<CSVParser<IteratorT> >
            {
                vector
            <string>& v;
                LineInfo
            <IteratorT>& lineInfo;

                CSVParser( vector
            <string>& vec, LineInfo<IteratorT>& info ) : v(vec), lineInfo(info) { }

                template 
            <typename ScannerT>
                
            struct definition 
                
            {
                    rule
            <ScannerT> csv, val, quoted_val, naked_val;

                    definition(
            const CSVParser<IteratorT>& self)
                    
            {
                        csv 
            = val >> *(',' >> val) >>
                            (eol_p[NewLine
            <IteratorT>(self.lineInfo)] | end_p);

                        val 
            = *blank_p >>
                            ch_p(
            '\"'>> quoted_val[AddVal(self.v)] >> ch_p('\"'>>
                            
            *blank_p
                            
            | naked_val[AddVal(self.v)];

                        quoted_val 
            = *(eol_p[NewLine<IteratorT>(self.lineInfo)]
                        
            | ~ch_p('"'| str_p("\"\""));

                        naked_val 
            = *(~ch_p(','& ~ch_p('\"'& ~ch_p('\n'));
                    }


                    
            const rule<ScannerT>& start() const return csv; }
                }
            ;
            }
            ;

            template
            <typename IteratorT>
            parse_info
            <IteratorT>
            parse_csv( 
            const IteratorT& first, const IteratorT& last,
                      vector
            <string>& vec, LineInfo<IteratorT>& info )
            {
                CSVParser
            <IteratorT> csv(vec, info);

                
            return parse(first, last, csv);
            }


            int main( int argc, char** argv)
            {
                
            if (argc != 2return 1;

                typedef file_iterator
            <char> iterator_t;

                iterator_t begin(argv[
            1]);
                
            if (!begin)
                
            {
                    cout 
            << "Unable to open file: " << argv[1<< endl;
                    
            return -1;
                }


                iterator_t first 
            = begin;

                iterator_t last 
            = first.make_end();

                LineInfo
            <iterator_t> line_info( begin );
                
            while ( first != last )
                
            {
                    vector
            <string> v;
                    parse_info
            <iterator_t> info = parse_csv( first, last, v, line_info );

                    
            if (!info.hit)
                    
            {
                        cout 
            << "Error!!  Line: " << line_info.lineNum
                            
            << ", Column: " << distance(line_info.lineIter, info.stop)+1 << endl;
                        
            break;
                    }


                    cout 
            << "Parses OK:" << endl;
                    
            for (vector<string>::size_type i = 0; i < v.size(); ++i)
                        cout 
            << i+1 << "" << v[i] << endl;

                    cout 
            << "-------------------------\n";

                    first 
            = info.stop;
                }


                
            return 0;
            }

            posted on 2008-06-03 22:55 楊粼波 閱讀(3062) 評論(1)  編輯 收藏 引用

            評論

            # re: 使用boost::spirit實現的CSV文件解析類 2008-09-30 10:07 A0soft

            顯然作者的功底不錯。雖然在VC++6下面編譯通不過,但是在VC++8(VS2005)下面非常順利,連一個警告都沒有。
            命令行里的指出的文件好像只能排他打開。  回復  更多評論   

            香蕉久久夜色精品国产2020| 热99RE久久精品这里都是精品免费 | 热re99久久精品国产99热| 久久精品免费一区二区三区| 久久久久人妻一区精品果冻| 久久精品一本到99热免费| 久久综合九色综合久99| 国产免费久久精品99re丫y| 国产精品久久久福利| 久久久久亚洲AV片无码下载蜜桃| 久久99国产综合精品免费| 亚洲午夜久久久| 大蕉久久伊人中文字幕| 精品免费久久久久久久| 久久精品视频一| 久久婷婷五月综合成人D啪| 久久无码人妻一区二区三区| 久久精品综合网| 久久久久久久久久免免费精品| 久久成人精品视频| 国产亚洲色婷婷久久99精品| 久久久亚洲裙底偷窥综合| 久久久人妻精品无码一区| 9191精品国产免费久久| 国产成人精品久久二区二区| 久久丫精品国产亚洲av不卡 | 国产精品毛片久久久久久久| 亚洲va久久久噜噜噜久久男同| 武侠古典久久婷婷狼人伊人| 久久国产亚洲精品麻豆| 亚洲午夜久久久精品影院| 三上悠亚久久精品| 久久久久久久精品成人热色戒| 久久久久人妻精品一区三寸蜜桃 | 久久综合亚洲色一区二区三区| 国产成人香蕉久久久久| 亚洲国产精品久久久久| 国产成人精品久久| 久久久久一本毛久久久| 亚洲性久久久影院| 国产激情久久久久久熟女老人|