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

            欧美午夜A∨大片久久| 日本三级久久网| 女人高潮久久久叫人喷水| 久久天天躁狠狠躁夜夜2020| 久久亚洲AV无码精品色午夜| 狠狠狠色丁香婷婷综合久久五月 | 久久亚洲sm情趣捆绑调教| 亚洲国产另类久久久精品黑人| 久久久久无码精品国产不卡| 国产激情久久久久影院老熟女免费 | 国产日韩久久久精品影院首页| 亚洲欧洲久久久精品| 久久一区二区三区免费| 综合久久一区二区三区| 青青热久久综合网伊人| 亚洲精品乱码久久久久久蜜桃不卡 | 日本精品一区二区久久久| 久久ZYZ资源站无码中文动漫| 久久精品免费大片国产大片| 嫩草伊人久久精品少妇AV| 日韩va亚洲va欧美va久久| 亚洲国产成人久久精品动漫| 久久人妻少妇嫩草AV无码专区| 看全色黄大色大片免费久久久 | 久久久久人妻精品一区二区三区| 久久免费大片| 国产午夜电影久久| 国产午夜精品久久久久九九| 久久精品国产亚洲AV电影| 久久精品免费一区二区| 久久人人爽人人人人片av| 亚洲国产婷婷香蕉久久久久久| 精品国产婷婷久久久| 精品视频久久久久| 国产亚洲精午夜久久久久久 | 久久久久久综合网天天| 伊人久久大香线蕉成人| 狠狠色丁香婷婷久久综合五月| 久久综合精品国产一区二区三区 | 久久综合一区二区无码| 香蕉久久永久视频|