solox 发表于 2014-10-14 09:48:14

【已解决】如何读取文本文件倒数第二行的内容

本帖最后由 solox 于 2014-10-15 13:17 编辑

文本是这样的这是第一行
这是第二行
这是第三行
.....
.....
这是第N万行
这是最后一行(空行,不是空白行)我搜索了一下,以前也有朋友问过,http://www.autoitx.com/forum.php?mod=viewthread&tid=29515&highlight=%B5%B9%CA%FD%B5%DA%B6%FE%D0%D0
解决方式使用的是FileCountLines,这个我也想到过,而且可以正常获取,但效率太低,而afan老大的方法没看懂
实际情况:
1、这个文件非常大,如果使用FileCountLines效率非常的低
2、这个文件是软件的运行日志文件,无法用fileDelete删除或者把内容清空后保存,也就是在软件运行过程中我无法去重建它
问题
1、我有一个想法是把最后一行删掉(不保存),再去读取新的最后一行(即原来的倒数第二行),有没有办法实现?
2、或者其他可以比较效率的读取第二行的办法?
3、或者有没有强制删除这个文件的办法,这样软件会自动重建它?

kevinch 发表于 2014-10-14 10:55:12

$f=@ScriptDir&"\temp.txt"
$t=TimerInit()
$str=FileRead($f)
$arr=StringSplit($str,@CRLF,1)
ConsoleWrite($arr&@TAB&TimerDiff($t)&@CRLF)这样试下

header 发表于 2014-10-14 11:30:01

StringSplit 的效率也高不到哪去

header 发表于 2014-10-14 11:33:40

要不试下StringInStr ( "字符串", @crlf [, 区分大小写 [, 出现次序 [, 开始 [, 数量]]]] )
出现次序写为负数然后截取字符串?

kevinch 发表于 2014-10-14 11:45:15

回复 3# header
100万行文本,2.5秒,你还想多快

solox 发表于 2014-10-14 12:01:48

StringSplit 的效率不会比 FileCountLines 的效率高吧

kevinch 发表于 2014-10-14 12:10:00

回复 6# solox
那个udf也是用的stringsplit,问题是你调用这个udf,他会再打开一次文件,一个100w行的文本文件,我这晨读取要用0.9秒左右,stringsplit后到出结果需要1.5秒左右,你调用这个udf多读取一次,然后还要用其他方法再实现类似的功能一下,自己想会不会快

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

solox 发表于 2014-10-14 12:29:47

啊,确实是这样子的,批评得对,FileCountLines用的就是stringsplit,而且要再打开文件一次,文件越大耗时越长。
谢谢kevinch,这个方法我先用着,呵呵
同时寻求其他更快的方法,因为事件发生时,这个文件50~100毫秒左右写入一行。我需要最快的速度读取并判断事件,然后让软件再最短的时间内做出反应,所以对速度要求比较高。

netegg 发表于 2014-10-14 12:41:24

为什么不倒序读

solox 发表于 2014-10-14 13:28:39

回复 9# netegg

请问怎么倒序读?

kevinch 发表于 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纯文本截取快很多,读取大文本依然很慢

solox 发表于 2014-10-14 14:20:19

回复 11# kevinch

可能跟机器配置有关,在我的机器上,你的这个方法比上个方法,读取要快,得到结果要慢

kevinch 发表于 2014-10-14 14:28:01

回复 12# solox
上一个是把读取的时间也得到结果的放在一起算的,这个分开了

netegg 发表于 2014-10-15 05:56:50

正则我不太会,应该可以直接出来数组,读取读取倒数第二个元素就行了

solox 发表于 2014-10-15 07:31:44

FileReadLine 的方法要比读取全文件再 StringSplit 快很多,可惜没找到该函数定义文件,不知道 FileReadLine 的机制,不然可以推敲一下怎么直接读倒数第二行
页: [1] 2
查看完整版本: 【已解决】如何读取文本文件倒数第二行的内容