smooth 发表于 2014-2-10 17:11:50

[已解决]请教大家如何从文本里取出这些文件名?

本帖最后由 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等等这些文件名,今天弄了一天,虽然有点进展,但是还不能最终实现。因为考虑到这些文件名中间可能有空格,就把我难住了。只好前来请教大家指点,谢谢!

附件:

ysw0145 发表于 2014-2-10 18:26:10

如果说这些文本中项目的宽度(字符数)都相同的话,就截长度,去空格

smooth 发表于 2014-2-10 18:39:05

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


如果文件名里有空格,这些代码就解决不了了,因为在用正则替换的过程中,把空格都搞掉了。

afan 发表于 2014-2-10 18:55:47

#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))

netegg 发表于 2014-2-10 19:22:03

afan又炫技了,佩服{:face (84):}

smooth 发表于 2014-2-10 22:03:26

回复 4# afan

afan厉害,短短几句代码,能完成我几十句代码都没有彻底解决的问题。

smooth 发表于 2014-2-11 18:12:24

本帖最后由 smooth 于 2014-2-11 18:13 编辑

回复 4# afan
今天在使用的时候,突然发现这样取出来的是不完整的,少了一个TEMP文件名。完成的文件名是:
SYSTEM
SYSAUX
UNDOTBS1
USERS
TEMP
EXAMPLE
NNC_DATA01
NNC_INDEX01
NNC_DATA02
NNC_INDEX0
而用你的代码取出来是这样的:

afan 发表于 2014-2-11 22:08:38

回复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”的,故做了修改。

smooth 发表于 2014-2-11 23:25:19

回复 8# afan

那是因为我的代码写的有问题,我漏掉了NO的那一行,呵呵。我今天突然才发现的。

smooth 发表于 2014-2-11 23:26:28

回复 8# afan

那是因为我的代码写的有问题,我漏掉了NO的那一行,呵呵。我今天突然才发现的,呵呵,不好意思。

afan 发表于 2014-2-11 23:28:52

Local $aSR = StringRegExp($str, '(?mi)^\h+\d+\h+(.+?\H)\h+\H+\h+\v', 3)

58fly 发表于 2014-2-13 05:21:11

什么时候才能把正则学明白啊..头疼

imlzr 发表于 2014-2-17 09:37:14

什么时候才能把正则学明白啊..头疼
58fly 发表于 2014-2-13 05:21 http://autoitx.com/images/common/back.gif


    同上,头疼这个东西的很。学的时候觉得自己懂了,一丢开书本就不知道咋用了。而且好久不用就要忘记,比五笔字根还难。

ak47gglllk 发表于 2014-2-17 11:05:48

抬头仰望各位大大。。。。。。

dawntop 发表于 2014-2-17 22:25:30

正则表达式的强大力量。
页: [1] 2
查看完整版本: [已解决]请教大家如何从文本里取出这些文件名?