itsky2 发表于 2020-1-28 19:45:14

【已解决,感谢:floor6ggg】求个正则,谢谢各位!

本帖最后由 itsky2 于 2020-1-31 17:31 编辑

第一段数据:
DiskPartitionsCylindersHeadsSectorsMbytesModel
1      3      121601   255      63953869.8ST1000DM 003-1SB102 CC63


PartitionStatus   Type   Volume Label   Mbytes   System   Usage
C:1      A    PRIMARY    本地磁盘    255190.2NTFS/HPFS27%
D:2             PRIMARY    本地磁盘    596277.6NTFS/HPFS63%
E:3             PRIMARY    本地磁盘    102400.0NTFS/HPFS11%



需求:对第二个表格的除第一行的数据生成一个二维数组,如果不行的话也可以包含


第二段数据:
DiskPartitionsCylindersHeadsSectorsMbytesModel
1      3      121601   255      63953869.8ST1000DM 003-1SB102 CC63
2      2         3738   255      63   29327.4SanDisk Ultra USB 3.0 1.00



需求:对表格的除第一行的数据生成一个二维数组,如果不行的话也可以包含


谢谢大家!!!

itsky2 发表于 2020-1-31 14:20:49

floor6ggg 发表于 2020-1-31 13:41
手机打字,没办法测试,目测:
将 : '(:\s+\d+)\s+()\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+( ...

DiskPartitionsCylindersHeadsSectorsMbytesModel
2      2         3738   255      63   29327.4SanDisk Ultra USB 3.0 1.00

PartitionStatus   Type   Volume Label   Mbytes   System   Usage
H:1      A    PRIMARY               25231.4NTFS/HPFS86%
   2      H    PRIMARY    EFI         2045.4FAT16       7%

试了下直接闪退了

yuantian 发表于 2020-1-28 22:30:23

本帖最后由 yuantian 于 2020-1-28 23:45 编辑

才疏学浅,
第一段只做成了一维数组了,但是不知道怎么两个内容分开
第一段做出来后,第二段相对来说简单点,不过也有坑。


[*]第一段
#include <Array.au3>

$Value1 = "DiskPartitionsCylindersHeadsSectorsMbytesModel" & @CRLF _
                & "1      3      121601   255      63953869.8ST1000DM 003-1SB102 CC63" & @CRLF _
                & "" & @CRLF _
                & "" & @CRLF _
                & "PartitionStatus   Type   Volume Label   Mbytes   System   Usage" & @CRLF _
                & "C:1      A    PRIMARY    本地磁盘    255190.2NTFS/HPFS27%" & @CRLF _
                & "D:2             PRIMARY    本地磁盘    596277.6NTFS/HPFS63%" & @CRLF _
                & "E:3             PRIMARY    本地磁盘    102400.0NTFS/HPFS11%"


$Array1 = StringRegExp($Value1, "(?m)((?:\S+\s){2}\S+|\w\:\s{1,8}\d+|(?<=\s{8})\s(?=\s{4})|\S+)", 3)
_ArrayDisplay($Array1,"第一段数据")


==================
[*]第二段
#include <Array.au3>

;第二段相对来说就比较好说了,但是我还是用的笨方法。
Local $TmpArray
$Value2 = "DiskPartitionsCylindersHeadsSectorsMbytesModel" & @CRLF _
                & "1      3      121601   255      63953869.8ST1000DM 003-1SB102 CC63" & @CRLF _
                & "2      2         3738   255      63   29327.4SanDisk Ultra USB 3.0 1.00"

;先将数据分组
$Array2 = StringRegExp($Value2, "(?m)((?:\S+\s){2,8}\S+|\S+)", 3)

;再将数组分段
If IsInt(UBound($Array2)/7) Then
      For $a = 0 To UBound($Array2) - 1 Step 7
                $TmpArray1 = _ArrayExtract($Array2,$a,$a+6)
                _ArrayTranspose($TmpArray1)
                Switch$a
                        Case 0
                              $TmpArray = $TmpArray1
                              
                        Case Else
                              _ArrayAdd ( $TmpArray, $TmpArray1)
                        
                EndSwitch
      Next
Else
      Msgbox(0, "", "正则表达式需调整!")
EndIf
_ArrayDisplay($TmpArray,"第二段数据")




无奈水平有限,代码笨拙简陋,
只为抛砖引玉,期待有更好地回答。

floor6ggg 发表于 2020-1-28 23:09:56

本帖最后由 floor6ggg 于 2020-1-28 23:22 编辑

yuantian 发表于 2020-1-28 22:30
才疏学浅,
第一段只做成了一维数组了,但是不知道怎么两个内容分开
第一段做出来后,第二段相对来说简单 ...
好强的正则表达式!!赞!!!

我直接搜索了一下论坛发现很多类似的帖子………………然后就……非常猥琐的不动脑筋了……模仿A版的写法,凑个热闹

floor6ggg 发表于 2020-1-28 23:11:37

本帖最后由 floor6ggg 于 2020-1-28 23:40 编辑

第一段:直接复制网页上的内容,可能有空格上的差错…………自行调整吧

### 友情提示:本脚本由 Au3.REHelper 于 2020/01/28 22:37 自动生成,不保证其正确性,请自行测试 ###
#include <Array.au3>
Local $sSource = _
                'DiskPartitionsCylindersHeadsSectorsMbytesModel' & @CRLF & _
                '1      3      121601   255      63953869.8ST1000DM 003-1SB102 CC63' & @CRLF & @CRLF & @CRLF & _
                'PartitionStatus   Type   Volume Label   Mbytes   System   Usage' & @CRLF & _
                'C:1      A    PRIMARY    本地磁盘    255190.2NTFS/HPFS27%' & @CRLF & _
                'D:2             PRIMARY    本地磁盘    596277.6NTFS/HPFS63%' & @CRLF & _
                'E:3             PRIMARY    本地磁盘    102400.0NTFS/HPFS11%'
Local $aSRE = StringRegExp($sSource, '(:\s+\d+)\s+()\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)', 3)
_ArrayDisplay($aSRE, UBound($aSRE))

Dim $aArray_new
For $i = 0 To UBound($aSRE) - 1
      $aArray_new=$aSRE[$i]
Next
_ArrayDisplay($aArray_new, 'new')

floor6ggg 发表于 2020-1-28 23:20:52

论坛的解法,果然简单粗暴………………

接下来的也类似,换汤不换药…………
### 友情提示:本脚本由 Au3.REHelper 于 2020/01/28 23:19 自动生成,不保证其正确性,请自行测试 ###
#include <Array.au3>
Local $sSource = _
                'DiskPartitionsCylindersHeadsSectorsMbytesModel' & @CRLF & _
                '1      3      121601   255      63953869.8ST1000DM 003-1SB102 CC63' & @CRLF & _
                '2      2         3738   255      63   29327.4SanDisk Ultra USB 3.0 1.00'
;~MsgBox(0, '源字符串', $sSource)
Local $aSRE = StringRegExp($sSource, '\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\S+)\s+(\S+)\s+([^\r\n]+)', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($aSRE), '其中元素为: ' & $aSRE)
_ArrayDisplay($aSRE, UBound($aSRE))

Dim $aArray_new
For $i = 0 To UBound($aSRE) - 1
        $aArray_new=$aSRE[$i]
Next
_ArrayDisplay($aArray_new, 'new')

floor6ggg 发表于 2020-1-28 23:42:08

不知道有没有可以一步到位的解法………………期待…………

floor6ggg 发表于 2020-1-28 23:47:10

再翻多了几个帖子,发现………………一模一样????A大的解法

http://www.autoitx.com/thread-30632-1-1.html

itsky2 发表于 2020-1-29 12:16:30

本帖最后由 itsky2 于 2020-1-30 10:21 编辑

yuantian 发表于 2020-1-28 22:30
才疏学浅,
第一段只做成了一维数组了,但是不知道怎么两个内容分开
第一段做出来后,第二段相对来说简单 ...$Value1 = _
                'DiskPartitionsCylindersHeadsSectorsMbytesModel' & @CRLF & _
                '1      5      60801   255      63476940.0ST3500320AS' & @CRLF & _
                "2      1          487   255      63    3824.0PNY USB 2.0 FD 4096"


$Data = StringRegExp($Value1, "(?m)^\h+(\d+)\h+(\d+)\h+(\d+)\h+(\d+)\h+(\d+)\h+([\d.]+)\h+(\V+)", 3)
Global $Array
For $i = 0 To UBound($Data) - 1
      $Array = $Data[$i]
Next

itsky2 发表于 2020-1-31 10:29:59

floor6ggg 发表于 2020-1-28 23:11
第一段:直接复制网页上的内容,可能有空格上的差错…………自行调整吧



还有没有盘符,即第一列是空格的情况,能否帮忙修改下?谢谢!

floor6ggg 发表于 2020-1-31 13:41:42

itsky2 发表于 2020-1-31 10:29
还有没有盘符,即第一列是空格的情况,能否帮忙修改下?谢谢!

手机打字,没办法测试,目测:
将 : '(:\s+\d+)\s+()\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)'

更改为: '(.*\s+\d+)\s+()\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)'

应该是可以的,试试看,
如果不行,把 你runcmd('gdisk.exe')返回结果的字符串贴上来…………

floor6ggg 发表于 2020-1-31 16:10:24

itsky2 发表于 2020-1-31 14:20
DiskPartitionsCylindersHeadsSectorsMbytesModel
2      2         3738   255      ...

(?m)(^{4,}\d+)\s+()\s+(\S+)\s+(.{3,5})\s+([\.\d]+)\s+(\S+)\s+([^\r\n]+)

floor6ggg 发表于 2020-1-31 16:13:18

本帖最后由 floor6ggg 于 2020-1-31 16:15 编辑

修改原因:
1.盘符 为空值考虑进去了
2.Volume Label也出现了空值,EFI等,和原来的‘本地磁盘’ 不一致的情况
再试一下,不行的话再修改

itsky2 发表于 2020-1-31 17:26:13

floor6ggg 发表于 2020-1-31 16:13
修改原因:
1.盘符 为空值考虑进去了
2.Volume Label也出现了空值,EFI等,和原来的‘本地磁盘’ 不一 ...

谢谢大神,完美解决了!

floor6ggg 发表于 2020-1-31 18:09:23

itsky2 发表于 2020-1-31 17:26
谢谢大神,完美解决了!

菜鸟一枚,非大神,。。。很高兴恰好会的那点能帮得上你,。。。。
页: [1] 2
查看完整版本: 【已解决,感谢:floor6ggg】求个正则,谢谢各位!