wongfung 发表于 2009-4-26 17:39:29

關於尋找文件中的目標行及取代指令

本帖最后由 wongfung 于 2009-4-28 22:07 编辑

1.請問如何尋找文件中的目標行?

例如該文件為

1
1
1
1
123456789
1
1
1

我想找123456789這行, 並提取89兩個數字, 然後輸出089
問問下面的代碼有甚麼地方有問題???
如何定義在某檔案中尋找呢???
$line = '1234567'
        $id = "000" & Number(StringLeft($line, 7))
        $id = StringRight($id, 3)


2.想問問兩個取代指令StringReplace及_ReplaceStringInFile的分別在那裏呢?
在使用StringReplace前如何定義目標檔案???

sensel 发表于 2009-4-26 18:07:30

1.用_FileReadToArray将文件读入数组,然后循环处理每一行,找到你想要的,进行处理并输出。
2.StringReplace的功能是在字符串中查找指定字符(串),将其替换为另一字符(串)。_ReplaceStringInFile则是在文件中查找并替换。

wongfung 发表于 2009-4-26 19:00:37

2# sensel


原文件是這樣:
id=1
n123
id=2
n123
id=3
n123
...
id=999
n123

我想變成這樣:
id=1
001123
id=2
002123
id=3
003123
...
id=999
999123

但我這樣寫不行:
#include <File.au3>
$file = FileOpenDialog("Open", @WorkingDir, "All Files(*.*)" , 1 )
FileCopy($file, $file & "_origin", 1)

$line = 'id='

$id = "000" & Number(StringMid($line, 4))
$id = StringRight($id, 3)
        _ReplaceStringInFile($file, "n", $id , 0, 0)


1.請問那個地方出問題呢?
2.怎樣使用循環呢???(由1-999)
不知道用while wend        還是do until好...囧

sensel 发表于 2009-4-26 21:20:21

需求是把每行中的所有n替换成三位数的上个id值?那么不能用_ReplaceStringInFile,因为你无法确定每个n要替换的值。

#Include <File.au3>

$file = FileOpenDialog("Open", @WorkingDir, "All Files(*.*)" , 1 )
FileCopy($file, $file & "_origin", 1)

$line = 'id='

Local $aFileLine, $sID = ""

_FileReadToArray($file & "_origin", $aFileLine)   ; 将文件内容读入数组 $aFileLine
For $i = 1 To $aFileLine   ; $aFileLine 是文件总行数
        If StringLeft($aFileLine[$i], 3) = $line Then   ; 如果行的前三位等于关键字,进行处理
                $sID = StringTrimLeft($aFileLine[$i], 3)
                $sID = StringRight("000" & $sID, 3)
                ContinueLoop
        EndIf
        StringReplace($aFileLine[$i], "n", $sID)   ; 将无关键字的行中n替换成获取的id值
Next
_FileWriteFromArray($file & "_origin", $aFileLine, 1)   ; 将数组内容写回文件

wongfung 发表于 2009-4-26 23:45:49

需求是把每行中的所有n替换成三位数的上个id值?那么不能用_ReplaceStringInFile,因为你无法确定每个n要替换的值。

#Include

$file = FileOpenDialog("Open", @WorkingDir, "All Files(*.*)" , 1 )
FileCop ...
sensel 发表于 2009-4-26 21:20 http://www.autoitx.com/images/common/back.gif

嗯, 很感謝, 不過試了還是不行

另外我改了一些東西

我想將

id=1
n
n
n
id=2
n
n
n
...
id=999
n
n
n

轉成

id=1
0011
0012
0013
id=2
0021
0022
0023
...

以下的代碼無效...

#Include <File.au3>

$file = FileOpenDialog("Open", @WorkingDir, "All Files(*.*)" , 1 )
FileCopy($file, $file & "_origin", 1)

$line = "id="

Local $aFileLine, $sID = ""

_FileReadToArray($file & "_origin", $aFileLine)   ; 将文件内容读入数组 $aFileLine
For $i = 1 To $aFileLine   ; $aFileLine 是文件总行数
      If StringLeft($aFileLine[$i], 3) = $line Then   ; 如果行的前三位等于关键字,进行处理
                $sID = StringTrimLeft($aFileLine[$i], 3)
                $sID = StringRight("000" & $sID, 3)
                ContinueLoop
      EndIf
      StringReplace($aFileLine[$i], "n", $sID & "1",0 )   ; 将无关键字的行中n替换成获取的id值
                StringReplace($aFileLine[$i], "n", $sID & "2",0 )   ; 将无关键字的行中n替换成获取的id值
                StringReplace($aFileLine[$i], "n", $sID & "3",0 )   ; 将无关键字的行中n替换成获取的id值
Next
_FileWriteFromArray($file & "_origin", $aFileLine, 1)   ; 将数组内容写回文件

求解決方法...T-T

sensel 发表于 2009-4-27 00:57:53

id=65
0651
0652
0653
0654
...

是不是需要改成这样?每行原来的内容不要了?
还有,你要改的是哪个文件?突然发现你用的文件名是$file & "_origin",那么这个是备份文件,真正要改的是$file这个文件了?

wongfung 发表于 2009-4-27 16:54:12

本帖最后由 wongfung 于 2009-4-28 10:53 编辑

id=65
0651
0652
0653
0654
...

是不是需要改成这样?每行原来的内容不要了?
还有,你要改的是哪个文件?突然发现你用的文件名是$file & "_origin",那么这个是备份文件,真正要改的是$file这个文件了?
sensel 发表于 2009-4-27 00:57 http://www.autoitx.com/images/common/back.gif

嗯, 將原内容改成前面三個位, 再由id下面一行開始, 每行取代後都加一些不同東西, 直至另一id上的一行完, 現在假設是改3行
(id的範圍由0-999)

其結構為
id=x
---->由這裏   [三個位的id][不同東西1]
                   [三個位的id][不同東西2]
---->改到這裏[三個位的id][不同東西3]
id=x+1
循環...



我的想法是用3個不同的StringReplace並設定成1(即只改一行), 然後由上至下每行改, 最後返回下一個id繼續改, 一直loop到找不到下一個id為止, 不過我不知道如何實現...囧

例子:
id=99
0991
0992
0993
id=100
1001
1002
1003
...

其實當初我是想改原文件的, 不過原來可以改複製後的文件的
我之後會將
FileCopy
_FileReadToArray
_FileWriteFromArray
裏的$file & "_origin"
都改成$file & "_converted", 感謝提醒:)
页: [1]
查看完整版本: 關於尋找文件中的目標行及取代指令