找回密码
 加入
搜索
查看: 13329|回复: 17

[效率算法] 【已解决】如何读取文本文件倒数第二行的内容

 火.. [复制链接]
发表于 2014-10-14 09:48:14 | 显示全部楼层 |阅读模式
本帖最后由 solox 于 2014-10-15 13:17 编辑

文本是这样的
这是第一行
这是第二行
这是第三行
.....
.....
这是第N万行
这是最后一行(空行,不是空白行)
我搜索了一下,以前也有朋友问过,http://www.autoitx.com/forum.php ... D%B5%DA%B6%FE%D0%D0
解决方式使用的是FileCountLines,这个我也想到过,而且可以正常获取,但效率太低,而afan老大的方法没看懂
实际情况:
1、这个文件非常大,如果使用FileCountLines效率非常的低
2、这个文件是软件的运行日志文件,无法用fileDelete删除或者把内容清空后保存,也就是在软件运行过程中我无法去重建它
问题
1、我有一个想法是把最后一行删掉(不保存),再去读取新的最后一行(即原来的倒数第二行),有没有办法实现?
2、或者其他可以比较效率的读取第二行的办法?
3、或者有没有强制删除这个文件的办法,这样软件会自动重建它?
发表于 2014-10-14 10:55:12 | 显示全部楼层
$f=@ScriptDir&"\temp.txt"
$t=TimerInit()
$str=FileRead($f)
$arr=StringSplit($str,@CRLF,1)
ConsoleWrite($arr[UBound($arr)-2]&@TAB&TimerDiff($t)&@CRLF)
这样试下

评分

参与人数 1金钱 +30 收起 理由
solox + 30 谢谢帮忙

查看全部评分

发表于 2014-10-14 11:30:01 | 显示全部楼层
StringSplit 的效率也高不到哪去
发表于 2014-10-14 11:33:40 | 显示全部楼层
要不试下StringInStr ( "字符串", @crlf [, 区分大小写 [, 出现次序 [, 开始 [, 数量]]]] )
出现次序写为负数然后截取字符串?
发表于 2014-10-14 11:45:15 | 显示全部楼层
回复 3# header
100万行文本,2.5秒,你还想多快
 楼主| 发表于 2014-10-14 12:01:48 | 显示全部楼层
StringSplit 的效率不会比 FileCountLines 的效率高吧
发表于 2014-10-14 12:10:00 | 显示全部楼层
回复 6# solox
那个udf也是用的stringsplit,问题是你调用这个udf,他会再打开一次文件,一个100w行的文本文件,我这晨读取要用0.9秒左右,stringsplit后到出结果需要1.5秒左右,你调用这个udf多读取一次,然后还要用其他方法再实现类似的功能一下,自己想会不会快

我们需要的不是各种质疑,而是去实际测试

评分

参与人数 1金钱 +20 收起 理由
vigiles + 20

查看全部评分

 楼主| 发表于 2014-10-14 12:29:47 | 显示全部楼层
啊,确实是这样子的,批评得对,FileCountLines用的就是stringsplit,而且要再打开文件一次,文件越大耗时越长。
谢谢kevinch,这个方法我先用着,呵呵
同时寻求其他更快的方法,因为事件发生时,这个文件50~100毫秒左右写入一行。我需要最快的速度读取并判断事件,然后让软件再最短的时间内做出反应,所以对速度要求比较高。
发表于 2014-10-14 12:41:24 | 显示全部楼层
为什么不倒序读
 楼主| 发表于 2014-10-14 13:28:39 | 显示全部楼层
回复 9# netegg

请问怎么倒序读?
发表于 2014-10-14 13:52:31 | 显示全部楼层
本帖最后由 kevinch 于 2014-10-14 13:54 编辑
$f=@ScriptDir&"\temp.txt"
$t=TimerInit()
$str=FileRead($f)
ConsoleWrite(TimerDiff($t)&@CRLF)
$t=TimerInit()
$end=0
For $n=StringLen($str) To 1 Step -1
        If $end And StringMid($str,$n,1)=@LF Then
                ConsoleWrite(StringMid($str,$n+1,$end-$n-2)&@TAB&TimerDiff($t)&@CRLF)
                ExitLoop
        EndIf
        If StringMid($str,$n,1)=@LF Then $end=$n-2
Next
纯文本截取快很多,读取大文本依然很慢
 楼主| 发表于 2014-10-14 14:20:19 | 显示全部楼层
回复 11# kevinch

可能跟机器配置有关,在我的机器上,你的这个方法比上个方法,读取要快,得到结果要慢
发表于 2014-10-14 14:28:01 | 显示全部楼层
回复 12# solox
上一个是把读取的时间也得到结果的放在一起算的,这个分开了
发表于 2014-10-15 05:56:50 | 显示全部楼层
正则我不太会,应该可以直接出来数组,读取读取倒数第二个元素就行了
 楼主| 发表于 2014-10-15 07:31:44 | 显示全部楼层
FileReadLine 的方法要比读取全文件再 StringSplit 快很多,可惜没找到该函数定义文件,不知道 FileReadLine 的机制,不然可以推敲一下怎么直接读倒数第二行
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-13 22:27 , Processed in 0.089269 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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