• <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)下面非常順利,連一個警告都沒有。
            命令行里的指出的文件好像只能排他打開。  回復  更多評論   

            久久中文字幕无码专区| 久久综合伊人77777| 人妻精品久久久久中文字幕一冢本| 久久国产成人午夜aⅴ影院| 久久夜色精品国产www| 久久亚洲精品无码播放| 久久久久亚洲精品无码蜜桃| 久久夜色精品国产亚洲| 久久久亚洲欧洲日产国码是AV | 久久久久人妻一区精品色| 久久精品国产99国产精偷 | 超级97碰碰碰碰久久久久最新| 午夜欧美精品久久久久久久| 久久国产V一级毛多内射| 久久天天躁狠狠躁夜夜躁2O2O| 久久久久亚洲AV无码专区网站| 久久国产精品成人片免费| 久久伊人色| 香港aa三级久久三级| 男女久久久国产一区二区三区| 国产一区二区精品久久岳| 午夜精品久久久久久久久| 一本久久综合亚洲鲁鲁五月天| 久久99免费视频| 久久久久久无码Av成人影院| 久久久国产99久久国产一| 久久久久亚洲AV无码专区桃色| 色综合合久久天天综合绕视看 | 亚洲国产精品人久久| 久久夜色精品国产噜噜亚洲AV | 国产视频久久| 久久综合九色综合精品| 69SEX久久精品国产麻豆| 色偷偷偷久久伊人大杳蕉| 久久久精品国产免大香伊| 人人妻久久人人澡人人爽人人精品| 久久亚洲中文字幕精品一区| 欧美性猛交xxxx免费看久久久| 久久久91人妻无码精品蜜桃HD| 久久国产午夜精品一区二区三区| 精品久久一区二区|