搜索
查看: 851|回复: 7

如何删除文件最后一行 [修正]

[复制链接]

1

主题

14

帖子

91

积分

一级会员

Rank: 2

积分
91
发表于 2017-9-23 15:36:01 | 显示全部楼层 |阅读模式
本帖最后由 lucky4wj 于 2017-9-23 15:41 编辑

原帖参看:
http://bbs.aardio.com/forum.php? ... &extra=page%3D1

里面有个回帖:
模式匹配更简单;
var path = "d:\title.txt";
var str=string.load(path);
var p='([^\r\n]+?\r\n)$';
str=string.replace(str,p,"");
string.save(path,str );


测试程序,发现有问题:

io.open()

var path = "d:\test.txt";
var str=string.load(path);

io.print(str)
io.print("--------------")

var p='([^\r\n]+?\r\n)$';
str=string.replace(str,p,"");
string.save(path,str );

var str=string.load(path);
io.print(str)

execute("pause")
io.close()


执行结果:

这样效率会高些,
不需要全部读入、处理完后再写出,
--------------
这样效率会高些,
不需要全部读入、处理完后再写出,
请按任意键继续. . .

可以看到前后文件内容一致,根本没有改变。;


回复

使用道具 举报

0

主题

23

帖子

116

积分

一级会员

Rank: 2

积分
116
发表于 2017-9-23 17:00:41 | 显示全部楼层
根本没有变,那你可以试试去找一下原因,
'([^\r\n]+?\r\n)$'; 这个模式匹配看不懂的话,可以翻一下文档里的模式语法,他这个模式匹配里要求文件最后面多一个空行,如果你没有的话,当然就没反应了。

论坛里看到的代码,可以自己继续改进,例如
str = string.replace(str,'[\r\n]?([^\r\n]+)[\r\n]?$',"");

回复

使用道具 举报

3

主题

51

帖子

312

积分

二级会员

Rank: 3Rank: 3

积分
312
发表于 2017-9-24 17:47:46 | 显示全部楼层
  1. var path = "\test.txt";
  2. var lastline;
  3. var tab = {};

  4. for line in io.lines(path) {
  5.         table.push(tab,lastline);
  6.         lastline = line;
  7. }
  8. string.save(path, string.join(tab,'\r\n'));
复制代码
回复

使用道具 举报

1

主题

14

帖子

91

积分

一级会员

Rank: 2

积分
91
 楼主| 发表于 2017-9-25 09:43:04 | 显示全部楼层
楼上的效率不高,尤其是大文件时。
还是推荐 lujjjh 的方法,不需要全部读入、处理完后再写出,适合于较大的文件。
    import fsys.file;

    var file = fsys.file("C:\1.txt", "a+");
    io.open(file.handle).readback();
    file.seteof();
    file.close();
回复

使用道具 举报

12

主题

309

帖子

1798

积分

荣誉会员

Rank: 8Rank: 8

积分
1798
发表于 2017-9-25 10:38:37 | 显示全部楼层
lucky4wj 发表于 2017-9-25 09:43
楼上的效率不高,尤其是大文件时。
还是推荐 lujjjh 的方法,不需要全部读入、处理完后再写出,适合于较大 ...

但是同时也可以交流探讨一下其他的写法嘛,
我倒是觉得幻月的方法挺好的,如果需求就是要读取全部的数据,再删除最后一行呢,这时候他的写法就很好了。

感谢幻月分享代码!
回复

使用道具 举报

1

主题

14

帖子

91

积分

一级会员

Rank: 2

积分
91
 楼主| 发表于 2017-9-29 22:13:16 | 显示全部楼层
v13.65新增 io.seteof()函数,所以有新写法:

io.open()
filename="/test.txt"

hFile=io.open(filename,"wt")
for(i=1;10;1){       
        hFile.write(tostring(i))
        hFile.write('\n')
}
hFile.close()


showFile=function(filename){
        hFile=io.open(filename,"r")
        for line in io.lines(hFile){
                io.print(line)
        }
        hFile.close()
}

showFile(filename)
io.print('-----上面是原有内容--------')

hFile=io.open(filename,"a+")
hFile.seek("end",)
hFile.readback()
hFile.readback()
hFile.seteof()
hFile.close()

showFile(filename)
io.print('-----上面是删除后内容--------')

execute("pause")
io.close()
--------测试结果-----------
1
2
3
4
5
6
7
8
9
10
-----上面是原有内容--------
1
2
3
4
5
6
7
8
9
-----上面是删除后内容--------
请按任意键继续. . .
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-9-29 22:34:26 | 显示全部楼层
lucky4wj 发表于 2017-9-29 22:13
v13.65新增 io.seteof()函数,所以有新写法:

io.open()

你的文件最后有一个空行,换行符不是放到行尾的。
空行也是一行的。

测试代码也可以写简单一点,这样就清楚多了:
var str = /*
1
2
3
4
5
6
7
8
9
10*/


//保存测试文件
string.save("/test.txt",str);

//打开文件删除最后一行
var file = io.open("/test.txt","a+b");
file.seek(
"end");
file.readback();
file.seteof();

//显示删除后的文件内容
import console;
console.log( string.load(
"/test.txt") )
console.pause();


seteof.png
回复

使用道具 举报

1

主题

14

帖子

91

积分

一级会员

Rank: 2

积分
91
 楼主| 发表于 2017-9-29 23:09:52 | 显示全部楼层
Jacen.He 发表于 2017-9-29 22:34
你的文件最后有一个空行,换行符不是放到行尾的。
空行也是一行的。

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2018-12-15 16:49 , Processed in 0.093750 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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