lanzinc 发表于 2011-2-12 19:02:51

先对目标字符串进行预处理,去掉多余空白
从左往右扫描待分析字符串

如果第一字符是引号

就把随后的字符都入栈

直到碰到另外一个引号

碰到引号后 判断随后的字符是不是逗号
如果是

则把栈中的字符拷贝到一个字符数组,清空栈

将待分析字符串中碰到的那个逗号和逗号前面的字符都舍弃
作为新的待分析字符串,递归调用本程序进行处理

如果引号后面不是逗号就抛出一个错误退出
(这里可以试一试,如果引号后面不是逗号就继续入栈,直到碰到下一个引号)


如果待处理的字符串第一字符不是是引号

就把包括第一个字符的字符都入栈,直到碰到逗号

将栈中的字符都拷贝给一个字符数组,清空栈

将待分析字符串中碰到的那个逗号和逗号前面的字符都舍弃
作为新的待分析字符串,递归调用本程序进行处理

[ 本帖最后由 lanzinc 于 2011-2-13 09:00 编辑 ]

haulm 发表于 2011-2-12 21:19:44

我的分析器思路上没什么问题,的确比较难懂,而且有思路还要不停地调整,事实上我首帖的程序已经很接近了,但还差引号和分割相互交替可能出现未知的错误而挂掉,正常的excel 导出的文件一般不会。。。,还要花几天调试找出问题所以,问题在于考虑不全的地方会产生未知段错误,我来解释以下我的程序:

从左往右扫描待分析字符串

如果第一字符是引号 增加标志位inita=true

如果当前字符是引号且 标志位==true ,确保当前不是最后一个字符,检查后面的字符是否为分割符,如果是则把文本 current 导入字段列表 curList,只要有导入curList,清空 current 文本并将标志位重置为false。如果不是分割符,那么说明当前引号属于包含内容,current 文本加入这个引号---循环继续。

如果当前字符不是引号,如果是分割,号,检查前面一个字符是否是引号,如果是,确保current不为空,如果这空那么分割不成立,如果成立存入列表清空 current 文本,标志位清回 false。否则,假如当前是分割符,而标志位为 false,并且 current 文本不为空,说明cvs文本中遇到不用引号单纯用分割符号的表格,那么直接增加列表。如果标志位是 true 而当前遇到了分割符,说明不是分割作用,则current 增加文本。 如果当前不是引号又不是分割符号,则 current 增加文本。

修正:如果当前字符是最接近最后一个字符的那一个,检查最后一个是否是引号,如果是增加列表清空 current 和标志; 如果当前字符是最后一个并且不是引号,增加列表清空标志和 current 。

[ 本帖最后由 haulm 于 2011-2-12 21:21 编辑 ]

lanzinc 发表于 2011-2-13 08:34:51

分割符“ ,” 和分界符“ " ”交替的情况,有很多就是csv文件非法造成的,(不过CSV文件好像没有太具体的标准)


" aaaa, aaaaa",
你要如何解释
解释成
"aaaa和aaaaa" 两个字段
还是
aaaa,aaaaa 一个字段


程序给出错误提示就可以了。错误的东西不应该纵容的。
生成csv文件的时候,就应该先对用作格式符号的字符进行转义处理的

如果非要处理,先对目标字符串进行预处理,除掉多余空白,将合法的,非分割符 的“,” 和非分界符的“ "”转义成保留的特殊字符;
处理完了再转义回来就可以了

预处理采用多次扫描
每次扫描仅处理一种明确的情况就好了
预处理没考虑到的情况就当作非法csv文件
这样程序比较好写

[ 本帖最后由 lanzinc 于 2011-2-13 09:27 编辑 ]

haulm 发表于 2011-2-13 12:40:21

原帖由 lanzinc 于 2011-2-13 08:34 发表 http://www.linuxfans.org/bbs/images/common/back.gif
分割符“ ,” 和分界符“ " ”交替的情况,有很多就是csv文件非法造成的,(不过CSV文件好像没有太具体的标准)


" aaaa, aaaaa",
你要如何解释
解释成
"aaaa和aaaaa" 两个字段
还是
aaaa,aaaaa 一个字段


程序给出错误 ...
基于原来的代码稍做修正,最后的结果如图,如果在一个表格内也有"XXX","XXX",会被当独做为一个表格处理。
暂时不改了,我反倒觉得我这样的分割比 excel 要精准多了。。。
页: 1 [2]
查看完整版本: 有能力补充修正的请进,这几天脑子乱的。。。。