2016-07-30 75 views
1

我的任務是將HTML表格轉換爲2D陣列,以便我可以將內容寫入CSV文件。我越來越掛斷了創建第二個數組維度的最佳方式。這裏是我到目前爲止(樣本數據):來自HTML的2D陣列

$data = '<table style="width:100%"> <tr> <td>Jill</td> <td>Smith</td> <td>50</td> </tr> <tr> <td>Eve</td> <td>Jackson</td> <td>94</td> </tr> </table> ' 
$data = [regex]::matches($data, '<table.*?>(.+)</table>') 
$data = $data[0].Groups[1].value 
$arr = @() 
$arr = [regex]::matches($data, '<tr.*?>(.*?)</tr>') | % {$_.Groups[1].value} 

我現在有<tr>線(減去<tr>標籤)的陣列。有沒有辦法下一個拆分<td>元素,並從這些數組中創建一個數組?我可能會通過這種方式強制我的方式,但我覺得有一個更清潔,可能更優化的方式。

順便說一下,我使用PowerShell的v2。

+0

這似乎是缺失的魔術線。如果有人在這裏看到任何明顯的錯誤,我很樂意聽到他們! '0 ..($ arr.Length-1)| %{$ arr [$ _] = [regex] :: matches($ arr [$ _],'(。*?)')| %{$ _。Groups [1] .value}}' – bvy

回答

1

如果仔細看看到目前爲止,您會注意到一種模式:使用HTML片段的字符串,將其與正則表達式<tag.*?>(.*?)</tag>相匹配,並提取捕獲的組(括號之間的部分)從比賽。您可以爲<table>標籤以及<tr>標籤執行此操作。使用相同的方法爲每一行提取<td>標記的內容。

$arr | ForEach-Object { 
    [regex]::matches($_, '<td.*?>(.*?)</td>') | ForEach-Object { 
    $_.Groups[1].Value 
    } 
} 

[regex]::matches() | ForEach-Object {}語句給你的<td>值的每一行列表/陣列。如果你用一元逗號運算符前面加上他們,像這樣

$td = @() 
$arr | ForEach-Object { 
    $td += ,@([regex]::matches($_, '<td.*?>(.*?)</td>') | ForEach-Object { 
    $_.Groups[1].Value 
    }) 
} 

追加這些列表爲空數組你的數組追加一個整體,而不是追加每個元素,給你這樣的結果:

[ [ 'Jill', 'Smith', 50 ], [ 'Eve', 'Jackson', 94 ] ] 

代替扁平陣列:

[ 'Jill', 'Smith', 50, 'Eve', 'Jackson', 94 ] 

結果是不完全的2維陣列(它實際上是一個數組的數組而2維陣列WOU ld是具有2維的單個陣列)。不過,您通常會在PowerShell中處理這種事情。

爲了更好地理解你在這裏做什麼,你可能需要閱讀operators,arraysregular expressions