• <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 楊粼波 閱讀(3056) 評論(1)  編輯 收藏 引用

            評論

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

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

            久久免费看黄a级毛片| 久久香综合精品久久伊人| 婷婷伊人久久大香线蕉AV| 久久精品国产精品亚洲人人| 久久99热只有频精品8| 亚洲精品高清国产一线久久| 色老头网站久久网| 一本久久综合亚洲鲁鲁五月天| 热久久国产精品| 狠狠综合久久综合中文88| 一本大道加勒比久久综合| 国产精品免费看久久久香蕉 | 97久久国产亚洲精品超碰热| 一本一本久久aa综合精品| 中文精品久久久久人妻不卡| 国内精品九九久久精品| 精品国产青草久久久久福利| 狠狠色婷婷久久综合频道日韩 | 亚洲国产精品无码久久青草| 亚洲国产成人久久精品99| 久久亚洲日韩看片无码| 麻豆亚洲AV永久无码精品久久| 国产精品一区二区久久国产| 欧美亚洲国产精品久久蜜芽| 国产精品丝袜久久久久久不卡| 久久精品亚洲精品国产欧美| 欧美亚洲国产精品久久高清| 久久久一本精品99久久精品66| 99久久婷婷国产一区二区| 思思久久99热免费精品6| 久久久久久亚洲精品成人| 国产福利电影一区二区三区久久久久成人精品综合 | 一本大道久久东京热无码AV| 99久久无色码中文字幕人妻| 99精品国产在热久久| 久久99精品国产麻豆蜜芽| 亚洲色婷婷综合久久| 中文字幕一区二区三区久久网站| 亚洲国产小视频精品久久久三级| 国内精品伊人久久久久AV影院| 久久无码人妻精品一区二区三区|