免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4345 | 回复: 14
打印 上一主题 下一主题

求合并行的程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-17 15:44 |只看该作者 |倒序浏览
从文件读入将所有以\r\n为结尾的行与下一行合并,怎么写效率最高?

\r\n把原本是一行的数据辟成了两行,只有\n的无需合并

谢谢

论坛徽章:
0
2 [报告]
发表于 2007-10-17 16:15 |只看该作者

  1.                 FileInputStream in=new FileInputStream("D:\\test\\gentree\\ReadMe.txt");
  2.                 OutputStream out=new BufferedOutputStream(new          FileOutputStream("D:\\test\\gentree\\ReadMe2.txt"));//to save the merged file
  3.                 FileChannel inchannel=in.getChannel();

  4.                
  5.                 int BUF_SIZE=4096;
  6.                
  7.                 ByteBuffer buffer = ByteBuffer.allocate(BUF_SIZE);
  8.                 boolean remainR=false;
  9.                 _outer:
  10.                 while (inchannel.read(buffer) > 0) {
  11.                         buffer.flip();
  12.                         while (buffer.hasRemaining()) {
  13.                                 byte b = buffer.get();
  14.                                 remainR=false;
  15.                                 if (b == '\r') {

  16.                                         if (buffer.hasRemaining()) {
  17.                                                 byte next = buffer.get();
  18.                                                 if (next != '\n') {
  19.                                                         out.write(b);
  20.                                                         out.write(next);
  21.                                                 }

  22.                                         } else {

  23.                                                 buffer.rewind();
  24.                                                 buffer.put((byte)b);
  25.                                                 remainR=true;
  26.                                                 continue _outer;
  27.                                         }
  28.                                 } else {
  29.                                         out.write(b);
  30.                                 }
  31.                         }
  32.                         buffer.rewind();
  33.                
  34.                        
  35.                 }
  36.                 if (remainR) {
  37.                         out.write('\r');
  38.                 }

  39.                 out.flush();
  40.                
复制代码

汗一个,这个是最终版了

[ 本帖最后由 yovn 于 2007-10-18 11:16 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-10-17 18:32 |只看该作者
有问题,原本没有折断的行被折断了。

论坛徽章:
0
4 [报告]
发表于 2007-10-17 22:37 |只看该作者
正则替换

String.replace()??
看看api doc

论坛徽章:
0
5 [报告]
发表于 2007-10-17 22:59 |只看该作者
原帖由 艾斯尼勒 于 2007-10-17 23:37 发表
正则替换

String.replace()??
看看api doc


没错,一个replaceAll就搞定了,注意转义字符

论坛徽章:
0
6 [报告]
发表于 2007-10-17 23:01 |只看该作者
OK,改了一下,这次测试正常。

LS的,replaceAll得是String对象上的,等你从文件里读出来就已经丢失了\r\n的信息了,就是说你不知道是 \n还是\r\n.

再说,从算法的角度来考虑,replaceAll是字符串匹配的,KMP效率也才O(p+n),而不用可以O(n)

[ 本帖最后由 yovn 于 2007-10-17 23:12 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-10-17 23:26 |只看该作者
,没错,效率比较差,简单嘛。
不过“等你从文件里读出来就已经丢失了\r\n的信息了”是什么意思?
nio都会使用了,似乎不应该有这样的看法咯~

论坛徽章:
0
8 [报告]
发表于 2007-10-18 00:13 |只看该作者
原帖由 kakasi 于 2007-10-17 23:26 发表
,没错,效率比较差,简单嘛。
不过“等你从文件里读出来就已经丢失了\r\n的信息了”是什么意思?
nio都会使用了,似乎不应该有这样的看法咯~


replaceAll是针对String的,你得读出一个String吧,那么你如何读呢?
你应该是要一个BufferedReader.nextLine()类似的接口吧?
ok,这个函数返回的String已经不包含\r\n了.
这样不行,你可能也考虑read一个byte[]然后new String了吧,你得小心不要分开读\r\n.
看完这个你还坚持replaceAll可以很好解决这个问题,那我们实在没有必要讨论下去了,没有交集!

论坛徽章:
0
9 [报告]
发表于 2007-10-18 11:39 |只看该作者
好像还是有问题只能处理4096的数据量

论坛徽章:
0
10 [报告]
发表于 2007-10-18 11:48 |只看该作者
争论是没有必要的,我只是说读取文件的基本思想是保证完整地再现文件的内容而已。
特别在这种需要考虑到不同的换行符的情况下,是不可能使用readline函数的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP