目前有这样一个需求,一个很大的数据文件中每行代表一条记录,各个记录之间以\3分隔,行之间以\n分隔。我需要一行一行的读取,之后分隔各个字段,做一些统计的工作。但是现在有这样一个问题,有的记录中的某个字段的结尾可能含有回车符\r,例如:abc\3def\3ghi\r\3jkl\3mno\n
这样的话用readline方法,不管遇到\r或\n或\r\n都会当作行的分隔符,从而造成这一行数据从中间断开。readline中有一个重载的方法可以忽略掉换行\n,但对于回车\r有什么方法能够忽略掉这个字符吗?我尝试过用read一个字符一个字符的读取,然后判断是否为\r,是的话忽略继续读下一个字符,然后遇到\n的话再处理这一行。但文件很大,这样操作太慢了,有什么好的解决办法吗?

解决方案 »

  1.   

    方法一:可以在写这个数据文件的时候,判断一下,遇到\r就不写到数据文件中。
    方法二:把整个文件全读进来放到String里,然后用replaceAll()把\r替换掉,再对String进行spilt。
    方法三:用记事本打开数据文件->Ctrl+H->\r替换为“ ”-》“全部替换”。
      

  2.   


    如何替换?用sed吗?实际上这段程序是groovy写的,如果能用linux命令的话直接就用awk了,速度快还没这个问题。。
      

  3.   


    方法一:这个文件是上游数据库定期生成的,我无法操作。
    方法二:文件有16G左右,全读到String里,内存肯定不够。
    方法三:16G的文件记事本怎么打的开。。
      

  4.   

    其实我只想让你用方法一,不行的话只能分段读了~一次读512K,尾部没有\n的话留下跟下一段拼接,还是要replaceAll一下。
      

  5.   

    不要嫌每次读512慢,其实你readline读也有够慢的,如果readline读的内容很多的话,这个512你也可以自己调节,不过一次超过512K貌似效率会降低,看你内存了
      

  6.   

    写好了吗??
    我写了个类,您看看可以用不??我放在我的blog里了。
    http://goro.iteye.com/admin/blogs/1633979