[已解决]请教大家如何从文本里取出这些文件名?
本帖最后由 smooth 于 2014-3-25 11:40 编辑TS# NAME INCLUD
---------- ------------------------------------------------------------ ------
BIGFIL FLASHB ENCRYP
------ ------ ------
0 SYSTEM YES
NO YES
1 SYSAUX YES
NO YES
2 UNDOTBS1 YES
NO YES
TS# NAME INCLUD
---------- ------------------------------------------------------------ ------
BIGFIL FLASHB ENCRYP
------ ------ ------
4 USERS YES
NO YES
3 TEMP NO
NO YES
6 EXAMPLE YES
NO YES
TS# NAME INCLUD
---------- ------------------------------------------------------------ ------
BIGFIL FLASHB ENCRYP
------ ------ ------
7 NNC_DATA01 YES
NO YES
8 NNC_INDEX01 YES
NO YES
10 NNC_DATA02 YES
NO YES
TS# NAME INCLUD
---------- ------------------------------------------------------------ ------
BIGFIL FLASHB ENCRYP
------ ------ ------
11 NNC_INDEX02 YES
NO YES
已选择10行。
想取出SYSTEM、SYSAUX、UNDOTBS1等等这些文件名,今天弄了一天,虽然有点进展,但是还不能最终实现。因为考虑到这些文件名中间可能有空格,就把我难住了。只好前来请教大家指点,谢谢!
附件:
如果说这些文本中项目的宽度(字符数)都相同的话,就截长度,去空格 本帖最后由 smooth 于 2014-2-10 22:00 编辑
$sFilePath = "demo.txt"
Func _FileCountLines($sFilePath)
Local $hFile = FileOpen($sFilePath, 0)
If $hFile = -1 Then Return SetError(1, 0, 0)
Local $sFileContent = StringStripWS(FileRead($hFile), 2)
FileClose($hFile)
Local $aTmp
If StringInStr($sFileContent, @LF) Then
$aTmp = StringSplit(StringStripCR($sFileContent), @LF)
ElseIf StringInStr($sFileContent, @CR) Then
$aTmp = StringSplit($sFileContent, @CR)
Else
If StringLen($sFileContent) Then
Return 1
Else
Return SetError(2, 0, 0)
EndIf
EndIf
Return $aTmp
EndFunc ;==>_FileCountLines
Local $nLines, $Mid
$lines = _FileCountLines($sFilePath)
$hOpen = FileOpen($sFilePath, 0)
For $i = 1 To $lines
$rLine = FileReadLine($hOpen)
If StringRegExp($rLine, "\d") And StringInStr($rLine, "YES") Then
$rLine = StringReplace($rLine, "YES", "")
$rLine = StringRegExpReplace ($rLine, "[^A-Za-z0-9/\_/]", "")
For $i = 1 To StringLen($rLine)
$Mid = StringLeft($rLine, $i)
If StringIsDigit($Mid) = 0 Then
$r = $i - 1
ExitLoop
EndIf
Next
$rLine = StringRight($rLine, StringLen($rLine) - $r)
$nLines &= $rLine & @CRLF
EndIf
Next
FileClose($hOpen)
$hOpen = FileOpen($sFilePath, 2)
Local $Fwrite = FileWrite($hOpen, $nLines)
FileClose($hOpen)
如果文件名里有空格,这些代码就解决不了了,因为在用正则替换的过程中,把空格都搞掉了。 #include <Array.au3>
Local $Str = FileRead('demo-1.txt')
Local $aSR = StringRegExp($str, '(?mi)^\h+\d+\h+(.+?\H)\h+YES\h+\v', 3)
_ArrayDisplay($aSR, UBound($aSR)) afan又炫技了,佩服{:face (84):} 回复 4# afan
afan厉害,短短几句代码,能完成我几十句代码都没有彻底解决的问题。 本帖最后由 smooth 于 2014-2-11 18:13 编辑
回复 4# afan
今天在使用的时候,突然发现这样取出来的是不完整的,少了一个TEMP文件名。完成的文件名是:
SYSTEM
SYSAUX
UNDOTBS1
USERS
TEMP
EXAMPLE
NNC_DATA01
NNC_INDEX01
NNC_DATA02
NNC_INDEX0
而用你的代码取出来是这样的:
回复afan
今天在使用的时候,突然发现这样取出来的是不完整的,少了一个TEMP文件名。完成的文件名是:
...
smooth 发表于 2014-2-11 18:12 http://www.autoitx.com/images/common/back.gif
那个是我特意删掉的。本来取出来的包含之,但查看你的代码“If StringRegExp($rLine, "\d") And StringInStr($rLine, "YES") Then”意思不就是只要含“YES”的吗?而那个是“NO”的,故做了修改。 回复 8# afan
那是因为我的代码写的有问题,我漏掉了NO的那一行,呵呵。我今天突然才发现的。 回复 8# afan
那是因为我的代码写的有问题,我漏掉了NO的那一行,呵呵。我今天突然才发现的,呵呵,不好意思。 Local $aSR = StringRegExp($str, '(?mi)^\h+\d+\h+(.+?\H)\h+\H+\h+\v', 3) 什么时候才能把正则学明白啊..头疼 什么时候才能把正则学明白啊..头疼
58fly 发表于 2014-2-13 05:21 http://autoitx.com/images/common/back.gif
同上,头疼这个东西的很。学的时候觉得自己懂了,一丢开书本就不知道咋用了。而且好久不用就要忘记,比五笔字根还难。 抬头仰望各位大大。。。。。。 正则表达式的强大力量。
页:
[1]
2