在博文之前,先介绍一下文本模式和二进制模式的差别,两者主要是在回车换行的处理上,不同系统对回车换行的处理不一致。
CR: Carriage Return, 0X0D, “\r”
LF: Line Feed, 0X0A, “\n”
Dos和Windows采用回车+换行(CR+LG)表示下一行
UNIX采用换行符 (LF)表示下一行
MAC机采用回车符(CR)表示下一行
最近一直在开发湖北现场的割接工具,工具的执行流程贯穿到系统多个模块。和同事一起配合,同事开发的工具从现场的系统A中将数据导出到文本,然后由我的工具来将这些文本导入到现场的项目B中,也就是我们常说的数据割接,原因是项目升级,运营商已经商用的数据需要在新平台上继续使用。
开发环境:SUSE Linux + Oracle
测试环境:HP + Oracle
FTP上传工具:FlashFXP
注:在windows下编写完程序后FTP至SUSE或HP下进行调试和测试
开发自测完,代码提交CC,书写操作手册,自测完毕工具打包,程序的整个流程都按照需求描述成功走完,并能顺利将各个流程连贯起来。以为这次应该是没问题的,拿到现场应该是能顺利进行使用的,但没预料,还没发到现场,在测试部测试这一环节就出现了问题,本定于昨天早上8:30发到现场,但由于测试没有通过,顶着现场和领导们的压力,拉上我师兄,昨天一整天陪我在测试部整代码,反复调试和测试。终于在下午5点钟找到问题的根源:
windows下的文本文件是的换行处理是采用回车+换行(0D0A)的方式,linux下的文本文件的换行处理是采用换行(0A)的方式。在windows本地通过二进制方式从windows xp上传FTP到suse liunx后,windows下的回车换行符"\r\n"到了suse linux下并没有变为linux下的换行符"\n",也就是文本文件以二进制FTP到liunx下时,在文本记录中每行末尾追加了"\r\n",而通常如果以ASCII文本方式上传到suse linux后,文本每行的"\r"在suse会过滤掉的。于是部署在suse linux上的shell脚本在调用sqlldr函数将上传后的文本导入到系统B中,sqlldr总是提示字段值过长的异常信息,显然文本数据没有导入成功,因为oracle表中的字段定义为char(14),而上传后的文本文件的最后一个字段本来是14位,但加了"\r\n"后就变为16位。于是针对这个文本字段sqlldr到oracle时就会提示字段过长而插入不成功了。问题定位后,转而将文件以ASCII方式FTP至服务器上后,程序运行完全正常,问题解决。
同时测试发现,通过jsp流从windows上传文本文件到suse linux上时,文本文件中的"\r\n"到suse上后还是存在"\r\n",也没有转换为"\n"。
posted on 2008-03-27 19:50
cheng 阅读(2761)
评论(4) 编辑 收藏 所属分类:
Unix/Linux