【已解决,感谢: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
需求:对表格的除第一行的数据生成一个二维数组,如果不行的话也可以包含
谢谢大家!!!
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 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:22 编辑
yuantian 发表于 2020-1-28 22:30
才疏学浅,
第一段只做成了一维数组了,但是不知道怎么两个内容分开
第一段做出来后,第二段相对来说简单 ...
好强的正则表达式!!赞!!!
我直接搜索了一下论坛发现很多类似的帖子………………然后就……非常猥琐的不动脑筋了……模仿A版的写法,凑个热闹 本帖最后由 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')
论坛的解法,果然简单粗暴………………
接下来的也类似,换汤不换药…………
### 友情提示:本脚本由 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')
不知道有没有可以一步到位的解法………………期待………… 再翻多了几个帖子,发现………………一模一样????A大的解法
http://www.autoitx.com/thread-30632-1-1.html 本帖最后由 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 floor6ggg 发表于 2020-1-28 23:11
第一段:直接复制网页上的内容,可能有空格上的差错…………自行调整吧
还有没有盘符,即第一列是空格的情况,能否帮忙修改下?谢谢!
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')返回结果的字符串贴上来………… 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:15 编辑
修改原因:
1.盘符 为空值考虑进去了
2.Volume Label也出现了空值,EFI等,和原来的‘本地磁盘’ 不一致的情况
再试一下,不行的话再修改
floor6ggg 发表于 2020-1-31 16:13
修改原因:
1.盘符 为空值考虑进去了
2.Volume Label也出现了空值,EFI等,和原来的‘本地磁盘’ 不一 ...
谢谢大神,完美解决了!
itsky2 发表于 2020-1-31 17:26
谢谢大神,完美解决了!
菜鸟一枚,非大神,。。。很高兴恰好会的那点能帮得上你,。。。。
页:
[1]
2