Powershell从解析文件中填充数组

时间:2011-03-31 21:43:14

标签: powershell

决定从批处理转移到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,毫无疑问应该如此。我想要实现的是每行要放入数组的特定标记值。

所以我尝试了这个,因为我需要来自$ Htm变量中每一行/对象的第6个标记。

$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 :(得分:0)

所以这是$ 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>

我使用regex :: split删除每个标记,因此&lt;。*?&gt;基本上被移除了,我留下了我实际需要的数据。

2 2008.08.06 02:45修改1 0.10 1.54650 1.56250 1.54380

解析的html文件是一个表,因此每行的标记都是相同的。

同样问题是当我尝试将令牌分配给变量时,它不会“每行的令牌6进入数组”。它只分配找到的最后一个值。

写这当然让我觉得我知道问题,但不知道如何解决它。

答案 1 :(得分:0)

在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]
        }
}

答案 2 :(得分:0)

我看到你试图解析html。您是否考虑过将html转换为xml并使用xpath或简单的 dot 方法?

前段时间我写过关于How PowerShell can help programmers的文章,其中我展示了我成功使用的函数Convert-Html2Xml:)

快速示例,将向您显示此问题的答案数:

[7]: [xml]$x = download-page http://stackoverflow.com/questions/5506691/powershell-populate-array-from-parsed-file
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 http://stackoverflow.com/questions/5506691/powershell-populate-array-from-parsed-file)
[9]: $x |
>>   Select-Xml -XPath "//div[contains(@class, 'answers-subheader')]/h2" |
>>   Select -expand Node |
>>   Select -expand '#text'
>>
3 Answers