smooth 发表于 2014-3-11 09:32:08

[已解决]麻烦懂正则的朋友帮忙从文件中取出符合条件的表空间名字

本帖最后由 smooth 于 2014-3-25 11:37 编辑

麻烦懂正则的朋友帮忙从这个文件中取出表空间的名字。其中:SYSTEM、SYSAUX、USERS、TEMP、UNDOTBS1这五个表空间是系统默认的,遇到他们就丢失不管。表空间名前面的NC是用户名,它的长短是不固定的,也就是说,NC有可能是ABCDEFG,但只有一个,也就是说,每一行从开头到每个表空间的名字为止,长度都是统一的。

自己不懂正则,只要前来麻烦大家了,谢谢!

'N DEFAULT_TABLESPACE                                                         
-- ------------------------------                                             
NC SYSTEM                                                                     
NC SYSTEM                                                                     
NC SYSTEM                                                                     
NC SYSAUX                                                                     
NC SYSAUX                                                                     
NC NNC_DATA01                                                                  
NC SYSTEM                                                                     
NC SYSAUX                                                                     
NC SYSAUX                                                                     
NC SYSAUX                                                                     
NC SYSAUX                                                                     

'N DEFAULT_TABLESPACE                                                         
-- ------------------------------                                             
NC SYSAUX                                                                     
NC SYSAUX                                                                     
NC SYSAUX                                                                     
NC SYSAUX                                                                     
NC SYSAUX                                                                     
NC SYSAUX                                                                     
NC SYSAUX                                                                     
NC SYSAUX                                                                     
NC SYSAUX                                                                     
NC SYSAUX                                                                     
NC SYSAUX                                                                     

'N DEFAULT_TABLESPACE                                                         
-- ------------------------------                                             
NC SYSAUX                                                                     
NC USERS                                                                        
NC USERS                                                                        
NC USERS                                                                        
NC USERS                                                                        
NC USERS                                                                        
NC USERS                                                                        
NC USERS                                                                        
NC USERS                                                                        

已选择31行。

上面是文件的内容,按要求取出后,应该是得到NNC_DATA01这个字符串。放在帖子上位置等可能会发生变化,以附件的文件为准,谢谢大家了。

附件:

半翅鸟 发表于 2014-3-11 09:41:40

看不懂,你要取什么?NC NNC_DATA01    NC你是说表名前面不固定,表名不固定,表明后面不固定?那无规则怎么取,等大大吧。

zhouflye 发表于 2014-3-11 09:54:43

你这个只能正则匹配到所有NC后面的那个单词,然后程序在排除!

smooth 发表于 2014-3-11 10:09:23

回复 2# 半翅鸟

表空间名前面的NC是用户名,它的长短是不固定的,也就是说,NC有可能是ABCDEFG,但只有一个,也就是说,每一行从开头到每个表空间的名字为止,长度都是统一的。

smooth 发表于 2014-3-11 13:29:30

我用笨的办法来弄的

Local $CoLS = _FileReadLinesToArray("ChkSpace.txt")

Local $str
For $i = 1 To $CoLS - 1
        If $CoLS[$i] <> "" And Not StringInStr($CoLS[$i], "-") And Not StringInStr($CoLS[$i], "'") Then

                Local $TbSp = StringMid($CoLS[$i], StringInStr($CoLS[$i], " ", "", 1) + 1, StringInStr($CoLS[$i], " ", "", 2) - StringInStr($CoLS[$i], " ", "", 1) - 1)
               
                If $TbSp <> "SYSTEM" And $TbSp <> "SYSAUX" And $TbSp <> "USERS" And $TbSp <> "TEMP" And $TbSp <> "UNDOTBS1" Then

                        $str &= $TbSp & @CRLF
                EndIf
        EndIf
Next

MsgBox(0, 0, $str)

Func _FileReadLinesToArray($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   ;==>_FileReadLinesToArray

afan 发表于 2014-3-11 14:09:24

“NC”这个用户名是“脑残”吗?真谦虚啊~Local $str = FileRead('ChkSpace.txt')
Local $aSR = StringRegExp($str, '(?mi)^\w+\h+((?:(?!SYSTEM|SYSAUX|USERS|TEMP|UNDOTBS1).)+\S)\s+$', 3)
If Not @error Then MsgBox(0, '', $aSR)

smooth 发表于 2014-3-11 16:17:31

本帖最后由 smooth 于 2014-3-11 16:21 编辑

回复 6# afan

"NC"是用友ERP软件,New Century,即:新世纪

用正则2行代码,用普通方法要几十行代码,这就是差别啊。A大收正则徒弟吗?

auto 发表于 2014-3-11 20:12:16

好像是oracle的表?
直接在SQL语句把系统用户的相关过滤不是更好吗?

smooth 发表于 2014-3-12 09:57:45

回复 8# auto

是的,你说的很对,但是一开始我不知道,我查到的命令导出来就是那样的结果。

auto 发表于 2014-3-12 20:40:32

回复 9# smooth


    想要做什么呢?一般表空间是创建数据库就建立的。后期除扩建,很少用到吧?
页: [1]
查看完整版本: [已解决]麻烦懂正则的朋友帮忙从文件中取出符合条件的表空间名字