Заполнить массив Powershell из проанализированного файла - PullRequest
1 голос
/ 01 апреля 2011

Решил перейти от пакета к PowerShell (пакет много работает с WMI, но я решил, что мне действительно нужно двигаться дальше).

Проблема в том, что массивы не существуют в пакете, только переменные токена.Так что я вроде как набил их.

Все же

$Htm = dir *.htm | foreach {Get-Content $_.FullName} | Select-String sell,buy,s/l,t/p,modify | Select-String -NotMatch MM,== | ForEach {
$Type = [regex]::split($_,'<.*?>')
}

Этот фрагмент кода работает нормально, однако он заполняет $ Type при каждом разбиении, без сомнения, так и должно быть.Однако я хотел добиться определенного значения токена для каждой строки, помещаемой в массив.

Поэтому я попытался это сделать, поскольку мне нужен 6-й токен из каждой строки / объекта в переменной $ Htm.

$Htm = dir *.htm | foreach {Get-Content $_.FullName} | Select-String sell,buy,s/l,t/p,modify | Select-String -NotMatch MM,== | ForEach {
$Type = [regex]::split($_,'<.*?>')[6]
}

Однако это дает только 6-й токен из первой строки, а не из всех строк.Делать это в пакетном режиме можно было бы, работая полностью с циклом for, который я хотел бы вывести из привычки делать это, потому что, честно говоря, это была правильная сука.

Любая помощь будет признательна.

Ответы [ 3 ]

0 голосов
/ 01 апреля 2011

Вот некоторый работающий код после нашего чата в IRC.

$Htm = dir *.htm | Select-String sell,buy,s/l,t/p,modify |
    Select-String -NotMatch MM,== | ForEach-Object {
        $Tokens = [regex]::split($_,'<.*?>')
        New-Object PSObject -Property @{
            Action = $Tokens[6]
            LotSize = [int]$Tokens[8]
            OpenPrice = [decimal]$Tokens[10]
        }
}
0 голосов
/ 01 апреля 2011

Я вижу, вы пытаетесь разобрать HTML. Рассматривали ли вы преобразование HTML в XML и использовать XPath или простой точка подход?

Некоторое время назад я писал о Как PowerShell может помочь программистам , где я показываю функцию Convert-Html2Xml, которую использую довольно успешно:)

Быстрый пример, который покажет вам количество ответов на этот вопрос:

[7]: [xml]$x = download-page /4379279/zapolnit-massiv-powershell-iz-proanalizirovannogo-faila
Cannot convert value "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Powershell populate array from parsed file - Stack Overflow</title>
....
[8]: $x = Convert-html2Xml (download-page /4379279/zapolnit-massiv-powershell-iz-proanalizirovannogo-faila)
[9]: $x |
>>   Select-Xml -XPath "//div[contains(@class, 'answers-subheader')]/h2" |
>>   Select -expand Node |
>>   Select -expand '#text'
>>
3 Answers
0 голосов
/ 01 апреля 2011

Итак, вот значение для $ Htm [1]

<tr bgcolor="#E0E0E0" align=right><td>2</td><td class=msdate>2008.08.06 02:45</td><td>modify</td><td>1</td><td class=mspt>0.10</td><td style="mso-numb
er-format:0\.00000;">1.54650</td><td style="mso-number-format:0\.00000;" align=right>1.56250</td><td style="mso-number-format:0\.00000;" align=right>1
.54380</td><td colspan=2></td></tr>

Регулярное выражение :: split, которое я использую для удаления каждого тега, поэтому <. *?> По существу удаляются, и у меня остаются данные, которые мне действительно нужны.

2 2008.08.06 02:45 изменить 1 0.10 1.54650 1.56250 1.54380

Анализируемый html-файл является таблицей, поэтому токен одинаков для каждой строки.

Опять проблема в том, что когда я пытаюсь присвоить токен переменной, он не выдает «Токен 6 каждой строки входит в массив». Он присваивает только последнее найденное значение.

Запись этого, конечно, заставляет меня думать, что я знаю проблему, но не знаю, как ее исправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...