搜索
查看: 3602|回复: 7

分享 判断文件换行方式

  [复制链接]

47

主题

178

帖子

1166

积分

荣誉会员

Rank: 8Rank: 8

积分
1166
发表于 2012-12-27 01:52:06 | 显示全部楼层 |阅读模式
本帖最后由 wznjsy 于 2012-12-27 01:53 编辑

因为要匹配一些字符 被文件的换行方式给小小阻碍了一下, 潜心看文档和库文件,终于得到解决。现分享代码如下:
  1. /*
  2. Unix 系统里,每行结尾只有“<换行>”,即'\n';
  3. Windows系统里面,每行结尾是“<换行><回车 >”,即'\n\r';
  4. Mac系统里,每行结尾是“<回车>”。

  5. 0x0D(asc码是13) 指的是“回车” aardio中写为'\r' 是把光标置于本行行首
  6. 0x0A(asc码是10) 指的是“换行” aardio中写为'\n' 是把光标置于下一行的同一列
  7. 0x0D + 0x0A 回车换行 aardio中写为'\r\n' 把光标置于下一行行首
  8. */
  9. import fsys;
  10. str = string.load("D://test.txt");
  11. io.open()
  12. pattern ='(\x0D\x0A)'
  13. flag = string.match(str,pattern);
  14. if(flag){
  15.         io.print("WINDOWS 回车换行方式");       
  16. }else {
  17.         io.print("其他换行方式");
  18. }
复制代码
不过感觉这样的判断效率不高,取巧的方法应该是读取文件的前2行或者是后2行去查找这样的换行字符才对,但是 看了库文件, file.read 好像是不读取换行符号的。 再仔细看fsys.file的库文件,  感觉最标准的做法应该是从文档的开始去读取字符,直到读取到换行的符号为止。
把库文件中相关的代码附上,方便大家参考。

  1. var bytes = {}
  2. var ok,byte = ReadByte(owner.hfile,0,1,0)
  3. while(ok ? byte ? (byte!='\n'#) ){  
  4.         if(byte!='\r'#)
  5.                 push(bytes,byte);  
  6.         ok,byte = ReadByte(owner.hfile,0,1,0);
  7. }
  8. if(#bytes)
  9.         return ..string.pack(bytes);
复制代码
  1. ReadByte = ::Kernel32.api("ReadFile","bool(POINTER file,BYTE& buffer,INT bufferSize,INT& numBytes,pointer overlapped)")
  2. ReadFile = ::Kernel32.api("ReadFile","bool(POINTER file,string& buffer,INT bufferSize,INT& numBytes,pointer overlapped)")
复制代码
可惜个人能力有限 这里的代码 尤其是Kernel32理解起来还是有点难度, 就一起发布到这里,就当抛砖引玉吧。
回复

使用道具 举报

5

主题

442

帖子

2420

积分

五级会员

Rank: 8Rank: 8

积分
2420
发表于 2012-12-27 09:14:31 | 显示全部楼层

其实很简单的[code]import console; testLine = function(path){ var file = io.open(

其实很简单的
  1. import console;

  2. testLine = function(path){
  3.         var file = io.open("/main.aardio","r+b")
  4.         var line = file.read()       
  5.         var cr = string.right(line,1) == '\r';
  6.         file.close()
  7.         if( cr ){
  8.                 return "windows"
  9.         }
  10.         else {
  11.                 return "unix"
  12.         }
  13. }

  14. console.log( testLine("~\tools\update.aardio")  )
复制代码
回复

使用道具 举报

5

主题

442

帖子

2420

积分

五级会员

Rank: 8Rank: 8

积分
2420
发表于 2012-12-27 09:21:59 | 显示全部楼层

用你的方法每次读一个字符也可以,如下:[code]import console; testLine = function(path){ var fil

用你的方法每次读一个字符也可以,如下:
  1. import console;

  2. testLine = function(path){
  3.         var file = io.open("/main.aardio","r+b")
  4.        
  5.         var chr;
  6.         do{
  7.                 chr = file.read(1) //每次读一个字符
  8.                 if( chr == '\r' ){
  9.                         file.close()
  10.                         return "windows"
  11.                 }
  12.                 elseif( chr == '\n' ) {
  13.                         file.close()
  14.                         return "unix"
  15.                 }
  16.         }while( chr )
  17.        
  18.         return "binary"
  19. }

  20. console.log( testLine("~\tools\update.aardio")  )
复制代码
关键在 io.open() 的第二个参数中要指定 "b",也就是二进制模式,否则是读不到'\r'回车的
回复

使用道具 举报

47

主题

178

帖子

1166

积分

荣誉会员

Rank: 8Rank: 8

积分
1166
 楼主| 发表于 2012-12-28 20:45:51 | 显示全部楼层

[quote][size=2][color=#999999]神码 发表于 2012-12-27 09:14[/color] [url=forum.php?mod

神码 发表于 2012-12-27 09:14
其实很简单的

谢谢。你这个更方便更简单。
回复

使用道具 举报

0

主题

3

帖子

22

积分

新手入门

Rank: 1

积分
22
发表于 2013-7-9 16:39:07 | 显示全部楼层

学习了!{:)}

学习了!
回复

使用道具 举报

17

主题

97

帖子

4万

积分

新手入门

积分
44038
发表于 2013-7-11 16:01:35 | 显示全部楼层

这个顶,经常会用到类似的功能

这个顶,经常会用到类似的功能
有太多东西要学,可是感觉没时间。
回复

使用道具 举报

7

主题

76

帖子

493

积分

二级会员

Rank: 3Rank: 3

积分
493
发表于 2013-7-11 18:26:10 | 显示全部楼层

其实一个字符一个字符的读,并判断,是正确的做法。但要设置一个阀值,比如只读取前面3k个字符。如果读不到就按没有换行的文件处理。因为实际应用当中,有一些文件其实就

其实一个字符一个字符的读,并判断,是正确的做法。但要设置一个阀值,比如只读取前面3k个字符。如果读不到就按没有换行的文件处理。因为实际应用当中,有一些文件其实就是一个顺序文件,没有回车换行符的。假如用一次读入一行的方式来判断最右边一个字符是否是windows还是unix的换行符,当这个文件非常大,例如文件有几百兆的时候,那一次性读入一行的方式其实就是读入了整个文件,那内存耗费太厉害了。所以一般的文本编辑软件,都会有一个设置,在文件开始多少个字符以内查找换行符,这样是比较好的做法。
回复

使用道具 举报

0

主题

21

帖子

119

积分

一级会员

Rank: 2

积分
119
发表于 2017-6-13 16:14:08 | 显示全部楼层
新人没法发贴,只在此提问,官方文档中提到的连续模式与随机模式是什么意思,各位能不能给个例程说明下


  1. 'S' 连续模式
  2. 'R' 随机模式
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-20 03:23 , Processed in 0.093750 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表