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

            評論

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

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

            久久久久亚洲av无码专区 | 久久ww精品w免费人成| 久久国产成人| 精品国产热久久久福利| 青青青青久久精品国产| 久久精品国产99国产精品澳门| 久久精品国产亚洲av高清漫画| 青草国产精品久久久久久 | 日日躁夜夜躁狠狠久久AV| 亚洲?V乱码久久精品蜜桃| 亚洲?V乱码久久精品蜜桃 | 一本色道久久99一综合| 日韩精品久久无码人妻中文字幕| 久久午夜福利无码1000合集| 久久成人国产精品免费软件| 午夜精品久久久久久中宇| 久久精品国产亚洲av高清漫画| 久久久久亚洲精品无码蜜桃 | 久久夜色精品国产噜噜麻豆| 精品久久久久香蕉网| 国产精品久久久99| 亚洲性久久久影院| 久久丫精品国产亚洲av| 日韩精品国产自在久久现线拍 | 人人狠狠综合久久亚洲88| 青青热久久国产久精品 | 久久久久四虎国产精品| 久久久99精品一区二区| 模特私拍国产精品久久| 2021久久精品国产99国产精品| 久久天天躁狠狠躁夜夜2020| 亚洲精品国精品久久99热一| 日韩精品国产自在久久现线拍| 青青草原综合久久大伊人| 久久精品成人免费网站| 国产精品久久久久蜜芽| 久久精品国产亚洲欧美| 人妻无码中文久久久久专区| 久久亚洲国产精品五月天婷| 97久久久久人妻精品专区| 久久久久久精品久久久久|