ioripalm 发表于 2013-1-7 19:22:42

[已解决]搜索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)----------------------------------------------------------------------------------------------------------------

annybaby 发表于 2013-1-7 20:15:46

回复 1# ioripalm

是你觉得效率不高,还是试过了,确实是效率不高,需要的时间让你无法接受??
建议上码~

shqf 发表于 2013-1-7 20:40:35

从大到小搜索,那么搜了201301021100,接下去要搜201301021099吗?可这样的在文件中字串不会存在。我给个思路,不知快些否?_FileReadToArray()把文件内容按行读入数组,再在数组中添加201301021135,再进行数组排序,最后将数组写回文件。

netegg 发表于 2013-1-7 21:03:59

本帖最后由 netegg 于 2013-1-7 21:05 编辑

_filereadtoarray
_arrayfindall
_arrayinsert
_filewritefromarray

huangke 发表于 2013-1-8 13:49:21

_filereadtoarray
_arrayfindall
_arrayinsert
_filewritefromarray
netegg 发表于 2013-1-7 21:03 http://www.autoitx.com/images/common/back.gif

好厉害,好强,顶

love5173 发表于 2013-1-8 16:10:29

回复 1# ioripalm
这个要根据你要修改的这个文件内容多少来定
如果只有几行顺序读就可以了
如果比较大就要用折中发来找了
过程 先用_FileCountLines 获取行数
然后判定条件
1、大于最后一行的时间直接放最后
2、这个位置大于变量行数-1的时间,小于变量行数的时间
   仅仅思路,如果你写不出来我可以直接写代码,建议先自己琢磨一下

llww7779 发表于 2013-1-9 09:03:18

如果比较大就要用折中发来找了

annybaby 发表于 2013-1-9 09:05:52

回复 7# llww7779


    复制粘贴会被视为恶意灌水哦…

netegg 发表于 2013-1-10 05:12:23

回复 6# love5173
比较大的文件用udf都不合适,直接内存操作,fileflush搞

kevinch 发表于 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的代替一下
原理:从右向左逐渐缩短输入内容的长度,寻找前面内容匹配的行组合,提取出来后,循环这些行,把数据插入到对应位置,再替换回匹配的位置
局限:对于楼主这种递增数据可用

ioripalm 发表于 2013-1-28 20:40:04

本帖最后由 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:17:04

本帖最后由 netegg 于 2013-1-28 22:19 编辑

ArrayFindAll返回的不是数据,是所有包含数据的行索引构成的数组

ioripalm 发表于 2013-1-31 17:39:15

的帮助

本帖最后由 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)

经过测试 可以使用!谢谢大家的帮助!!

netegg 发表于 2013-1-31 17:45:49

行知道了,怎么插入还要再说吗,那是个数组操作呀

我是李大军 发表于 2013-2-12 13:53:54

http://www.niu-lan.com/bq/11.gif
页: [1] 2
查看完整版本: [已解决]搜索TXT文件,如何返回行号,并写入到指定位置?