posts - 188,comments - 176,trackbacks - 0

      在博文之前,先介绍一下文本模式和二进制模式的差别,两者主要是在回车换行的处理上,不同系统对回车换行的处理不一致。

      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 阅读(2545) 评论(4)  编辑  收藏 所属分类: Unix/Linux

FeedBack:
# re: 回车符和二进制引发的问题
2008-03-28 07:16 | ZelluX
常识。。。否则还要line.separator这东东干嘛。。。  回复  更多评论
  
# re: 回车符和二进制引发的问题
2008-03-28 15:11 | cheng
是啊,嗯...呵呵
理论知识还需巩固和加强.  回复  更多评论
  
# re: 回车符和二进制引发的问题
2008-03-28 16:09 | 草包书生
good  回复  更多评论
  
# re: 回车符和二进制引发的问题
2008-07-17 11:10 | xx
有道理 我刚刚也遇到了这样的问题 发现在linux下使用dos2unix也可以解决  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: