2016-07-30 3 views
1

Моя задача - преобразовать таблицу HTML в 2D-массив, чтобы я мог записать содержимое в файл CSV. Я получаю повесил трубку, чтобы создать второй размер массива. Вот то, что я до сих пор (с данными выборки):2D-массив из HTML

$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> и создать массив массивов из них? Я мог бы, вероятно, переборщиться с этим, но я чувствую, что есть более чистый и, вероятно, более оптимальный способ.

Кстати, я использую v2 PowerShell.

+0

Это, кажется, недостающая магическая линия. Если кто-нибудь увидит какие-либо вопиющие ошибки здесь, я буду рад их услышать! '0 .. ($ arr.Length-1) | % {$ arr [$ _] = [regex] :: matches ($ arr [$ _], ' (. *?)') | % {$ _. Группы [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, arrays и regular expressions.

Смежные вопросы