[已解决]搜索TXT文件,如何返回行号,并写入到指定位置?
本帖最后由 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)---------------------------------------------------------------------------------------------------------------- 回复 1# ioripalm
是你觉得效率不高,还是试过了,确实是效率不高,需要的时间让你无法接受??
建议上码~ 从大到小搜索,那么搜了201301021100,接下去要搜201301021099吗?可这样的在文件中字串不会存在。我给个思路,不知快些否?_FileReadToArray()把文件内容按行读入数组,再在数组中添加201301021135,再进行数组排序,最后将数组写回文件。 本帖最后由 netegg 于 2013-1-7 21:05 编辑
_filereadtoarray
_arrayfindall
_arrayinsert
_filewritefromarray _filereadtoarray
_arrayfindall
_arrayinsert
_filewritefromarray
netegg 发表于 2013-1-7 21:03 http://www.autoitx.com/images/common/back.gif
好厉害,好强,顶 回复 1# ioripalm
这个要根据你要修改的这个文件内容多少来定
如果只有几行顺序读就可以了
如果比较大就要用折中发来找了
过程 先用_FileCountLines 获取行数
然后判定条件
1、大于最后一行的时间直接放最后
2、这个位置大于变量行数-1的时间,小于变量行数的时间
仅仅思路,如果你写不出来我可以直接写代码,建议先自己琢磨一下 如果比较大就要用折中发来找了 回复 7# llww7779
复制粘贴会被视为恶意灌水哦… 回复 6# love5173
比较大的文件用udf都不合适,直接内存操作,fileflush搞 用正则替换吧,写个思路给你$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的代替一下
原理:从右向左逐渐缩短输入内容的长度,寻找前面内容匹配的行组合,提取出来后,循环这些行,把数据插入到对应位置,再替换回匹配的位置
局限:对于楼主这种递增数据可用 本帖最后由 ioripalm 于 2013-1-28 20:49 编辑
_filereadtoarray
_arrayfindall
_arrayinsert
_filewritefromarray
netegg 发表于 2013-1-7 21:03 http://www.autoitx.com/images/common/back.gif
测试可以用,速度也很快!谢谢!如果我的文件是这样的,如何能模糊搜索?有这个函数吗?
意思就是我搜索“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)
;~ 查找数组中匹配搜索值的所有元素的索引值
$aiResult = _ArrayFindAll($aArray, $vValue)
;~ 看一下在第几行
MsgBox(1, 1, $aiResult)
;~ 将数据写入到数组
_ArrayInsert($aArray, $aiResult,$nValue)
;~ 将数据写入到文件
_FileWriteFromArray($sFilePath, $aArray, 1) 本帖最后由 netegg 于 2013-1-28 22:19 编辑
ArrayFindAll返回的不是数据,是所有包含数据的行索引构成的数组
的帮助
本帖最后由 ioripalm 于 2013-1-31 21:26 编辑ArrayFindAll返回的不是数据,是所有包含数据的行索引构成的数组
netegg 发表于 2013-1-28 22:17 http://www.autoitx.com/images/common/back.gif
_ArrayFindAll的确返回一个数组,数组的是第一个找到的行号,是第二个找到的行号。
还有个问题就是,我可以模糊搜索吗?搜索一行中的几个字就能定位到这一行。
意思就是我搜索"201212270812"就能定位到"销售组 刘能丽 201212270812 入口2"这一行
搞定了,感谢大家的帮助,最后的代码大概是这样!我找到了一个_ArraySearch函数,这个函数的第4个参数可以设置为1(部分匹配),这个函数返回的结果就是行号!
$aArray = ""
$vValue = "201212270512"
$nValue = "测试能不能写入"
_FileReadToArray($sFilePath, $aArray)
MsgBox(1, 1, $aArray)
_ArrayDisplay($aArray, "数组")
;~ $aiResult = _ArrayFindAll($aArray, $vValue)
;~ MsgBox(1, 1, $aiResult)
;~ _ArrayDisplay($aiResult, "找到的行号")
$aiResult = _ArraySearch($aArray, $vValue, 0, 0, 0, 1)
_ArrayInsert($aArray, $aiResult,$nValue)
_ArrayDisplay($aArray, "添加元素后的新数组")
_FileWriteFromArray($sFilePath, $aArray, 1)
经过测试 可以使用!谢谢大家的帮助!! 行知道了,怎么插入还要再说吗,那是个数组操作呀 http://www.niu-lan.com/bq/11.gif
页:
[1]
2