找回密码
 加入
搜索
查看: 13209|回复: 19

[AU3基础] [已解决]搜索TXT文件,如何返回行号,并写入到指定位置?

 火.. [复制链接]
发表于 2013-1-7 19:22:42 | 显示全部楼层 |阅读模式
本帖最后由 ioripalm 于 2013-2-24 15:14 编辑

比如有个TXT文件,每一行都是一个日期格式的:
201301011201
201301011515
201301020706
201301021530
201301030606
201301031630

比如用户输入了一个“201301021135”,我想将这个日期按照顺序插入到:
201301011201
201301011515
201301020706
201301021135
201301021530
201301030606
201301031630

该怎么做才行呢?我的思路是按照日期从后面往前搜索(从前往后也可以),先搜索“201301021135”
没搜到就搜“201301021134”,再没搜到就搜“201301021133”,直到搜到为止,然后返回行号
_FileWriteToLine函数来写进去,但是找来找去没有可以返回“行号”的函数。

FileReadLine来一行行的找出来再对比的话,又觉得效率不高,请问大家有什么好办法吗?

------------------------------------------------------------------------------------------------------------------

已经找到解决方法,谢谢大家的帮助,谢谢论坛元老:netegg

#include <File.au3>
#include <Array.au3>
;~ 操作文件的路径
$sFilePath = "c:\考勤\201212.txt"
$aArray = ""
;~ 搜索值(部分匹配的内容,实际内容为:"销售组 刘能丽 201212270812 入口2"
)
$vValue = "201212270812"
;~ 测试要写入的数据
$nValue = "-------------测试能不能写入TXT------------"
;~ 将文件内容载入到数组
_FileReadToArray($sFilePath, $aArray)
;~ 查找数组中部分匹配搜索值的元素的索引值
$aiResult = _ArraySearch($aArray, $vValue, 0, 0, 0, 1)
;~ 将数据写入到数组
_ArrayInsert($aArray, $aiResult,$nValue)
;~ 将数据写入到文件
_FileWriteFromArray($sFilePath, $aArray, 1)
----------------------------------------------------------------------------------------------------------------
发表于 2013-1-7 20:15:46 | 显示全部楼层
回复 1# ioripalm

是你觉得效率不高,还是试过了,确实是效率不高,需要的时间让你无法接受??
建议上码~
发表于 2013-1-7 20:40:35 | 显示全部楼层
从大到小搜索,那么搜了201301021100,接下去要搜201301021099吗?可这样的在文件中字串不会存在。我给个思路,不知快些否?_FileReadToArray()把文件内容按行读入数组,再在数组中添加201301021135,再进行数组排序,最后将数组写回文件。
发表于 2013-1-7 21:03:59 | 显示全部楼层
本帖最后由 netegg 于 2013-1-7 21:05 编辑

_filereadtoarray
_arrayfindall
_arrayinsert
_filewritefromarray
发表于 2013-1-8 13:49:21 | 显示全部楼层
_filereadtoarray
_arrayfindall
_arrayinsert
_filewritefromarray
netegg 发表于 2013-1-7 21:03


好厉害,好强,顶
发表于 2013-1-8 16:10:29 | 显示全部楼层
回复 1# ioripalm
这个要根据你要修改的这个文件内容多少来定
如果只有几行顺序读就可以了
如果比较大就要用折中发来找了
过程 先用_FileCountLines 获取行数
然后判定条件
1、大于最后一行的时间直接放最后
2、这个位置大于变量行数-1的时间,小于变量行数的时间
   仅仅思路,如果你写不出来我可以直接写代码,建议先自己琢磨一下
发表于 2013-1-9 09:03:18 | 显示全部楼层
如果比较大就要用折中发来找了
发表于 2013-1-9 09:05:52 | 显示全部楼层
回复 7# llww7779


    复制粘贴会被视为恶意灌水哦…
发表于 2013-1-10 05:12:23 | 显示全部楼层
回复 6# love5173
比较大的文件用udf都不合适,直接内存操作,fileflush搞
发表于 2013-1-10 13:18:16 | 显示全部楼层
用正则替换吧,写个思路给你
$regex=ObjCreate("vbscript.regexp")
$regex.global=1
$regex.multiline=0
$str="201301011201" & @CRLF & _
        "201301011515" & @CRLF & _
        "201301020706" & @CRLF & _
        "201301021530" & @CRLF & _
        "201301030606" & @CRLF & _
        "201301031630"
MsgBox(0,"",$str)
$input="201301021135"
For $n=StringLen($input) To 1 Step -1
        $tmp=StringLeft($input,$n)
        $ptn="(("&$tmp&")(.*?)\n)+"
        $regex.pattern=$ptn
        If $regex.test($str) Then
                $ar=$regex.execute($str)
                $arr=StringSplit($ar(0).value,@CRLF,1)
                For $i=1 To UBound($arr)-2
                        If Number($input)<Number($arr[$i]) Then
                                $arr[$i]=$input&@crlf&$arr[$i]
                                ExitLoop
                        EndIf
                Next
                $tmp=""
                For $i=1 To UBound($arr)-2
                        $tmp&=$arr[$i]&@CRLF
                Next
                $str=StringRegExpReplace($str,$ptn,$tmp)
                ExitLoop
        EndIf
Next
$regex=Null
MsgBox(0,"",$str)
用不太好au3的正则,用vbs的代替一下
原理:从右向左逐渐缩短输入内容的长度,寻找前面内容匹配的行组合,提取出来后,循环这些行,把数据插入到对应位置,再替换回匹配的位置
局限:对于楼主这种递增数据可用
 楼主| 发表于 2013-1-28 20:40:04 | 显示全部楼层
本帖最后由 ioripalm 于 2013-1-28 20:49 编辑
_filereadtoarray
_arrayfindall
_arrayinsert
_filewritefromarray
netegg 发表于 2013-1-7 21:03


测试可以用,速度也很快!谢谢!如果我的文件是这样的,如何能模糊搜索?有这个函数吗?
意思就是我搜索“201212270812”就能定位到"销售组 刘能丽 201212270812 入口2"这一行
我还发现_ArrayFindAll是找到第一个符合条件后就返回索引了,不继续往下搜索了!

下面是我按照你给我的思路写的!

#include <File.au3>
#include <Array.au3>
;~ 操作文件的路径
$sFilePath = "c:\考勤\201212.txt"
$aArray = ""
;~ 搜索值
$vValue = "销售组 刘能丽 201212270812 入口2"
;~ 测试要写入的数据
$nValue = "-------------测试能不能写入TXT------------"
;~ 将文件内容载入到数组
_FileReadToArray($sFilePath, $aArray)
;~ 看一下一共几行
MsgBox(1, 1, $aArray[0])
;~ 查找数组中匹配搜索值的所有元素的索引值
$aiResult = _ArrayFindAll($aArray, $vValue)
;~ 看一下在第几行
MsgBox(1, 1, $aiResult[0])
;~ 将数据写入到数组
_ArrayInsert($aArray, $aiResult[0],$nValue)
;~ 将数据写入到文件
_FileWriteFromArray($sFilePath, $aArray, 1)
发表于 2013-1-28 22:17:04 | 显示全部楼层
本帖最后由 netegg 于 2013-1-28 22:19 编辑

ArrayFindAll返回的不是数据,是所有包含数据的行索引构成的数组
 楼主| 发表于 2013-1-31 17:39:15 | 显示全部楼层

的帮助

本帖最后由 ioripalm 于 2013-1-31 21:26 编辑
ArrayFindAll返回的不是数据,是所有包含数据的行索引构成的数组
netegg 发表于 2013-1-28 22:17


_ArrayFindAll的确返回一个数组,数组的[0]是第一个找到的行号,[1]是第二个找到的行号。
还有个问题就是,我可以模糊搜索吗?搜索一行中的几个字就能定位到这一行。
意思就是我搜索"201212270812"就能定位到"销售组 刘能丽 201212270812 入口2"这一行

搞定了,感谢大家的帮助,最后的代码大概是这样!我找到了一个_ArraySearch函数,这个函数的第4个参数可以设置为1(部分匹配),这个函数返回的结果就是行号!

$aArray = ""
$vValue = "201212270512"
$nValue = "测试能不能写入"
_FileReadToArray($sFilePath, $aArray)
MsgBox(1, 1, $aArray[0])
_ArrayDisplay($aArray, "数组")
;~ $aiResult = _ArrayFindAll($aArray, $vValue)
;~ MsgBox(1, 1, $aiResult[0])
;~ _ArrayDisplay($aiResult, "找到的行号")
$aiResult = _ArraySearch($aArray, $vValue, 0, 0, 0, 1)
_ArrayInsert($aArray, $aiResult,$nValue)
_ArrayDisplay($aArray, "添加元素后的新数组")
_FileWriteFromArray($sFilePath, $aArray, 1)

经过测试 可以使用!谢谢大家的帮助!!
发表于 2013-1-31 17:45:49 | 显示全部楼层
行知道了,怎么插入还要再说吗,那是个数组操作呀
发表于 2013-2-12 13:53:54 | 显示全部楼层
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-6 09:30 , Processed in 0.084038 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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