来自HTML的2D数组

时间:2016-07-30 20:07:57

标签: html arrays csv powershell powershell-v2.0

我的任务是将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。

1 个答案:

答案 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中处理这类事情。

为了更好地了解您在这里做了什么,您可能需要阅读operatorsarraysregular expressions