我的任务是将HTML表格转换为2D数组,以便将内容写入CSV文件。我正忙着创建第二个数组维度的最佳方法。这是我到目前为止(带有样本数据):
$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 :(得分: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个维度)。但是,你通常会在PowerShell中处理这类事情。
为了更好地了解您在这里做了什么,您可能需要阅读operators,arrays和regular expressions。