2011-03-31 57 views
1

決定從批處理移動到powershell(批處理與WMI有很多相似之處,但我決定真的需要繼續前進)。Powershell從解析文件中填充數組

問題是數組不存在批處理,只是令牌變量。所以我有點塞滿他們。

不過

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

這段代碼工作正常,但是它填補$類型與每一個分裂,無疑,因爲它應該。我想實現的是每行的特定標記值放入數組中。

所以我嘗試了這一點,因爲我需要$ 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] 
} 

但是,它只從第一行開始給出第六個標記,而不是從所有行開始。這樣做的批量操作可以通過完全使用for循環來實現,我希望避免這種習慣,因爲坦率地說這是一個正確的婊子。

任何援助將不勝感激。

+0

只是一個音符, PowerShell中的初學者往往會像在這裏一樣使用字符串,但實際上不需要將'$ _。FullName'傳遞給'Get-Content','$ _'就足夠了,因爲它是一個表示文件的對象。 'Get-Content'也可以直接從管道獲取文件名,所以'gci * .htm | gc'就足夠了。不需要'ForEach-Object'。 – Joey 2011-03-31 22:11:02

+0

你可以舉一個例子,看看更清楚你有什麼和你真正需要什麼 – mjsr 2011-03-31 23:48:04

回答

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> 

正則表達式::分裂我用它來除去每一個標籤,所以<。*?>基本上去除,我離開了我的數據我其實需要。

2 2008.08.06二點45修改1 0.10 1.54650 1.56250 1.54380

解析該HTML文件是一個表,所以該令牌是用於每一行是相同的。

問題再次出現時,我試圖將標記分配給變量,它不會「每行的標記6進入數組」。它只分配找到的最後一個值。

寫這當然讓我覺得我知道問題,但不知道如何解決它。

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] 
     } 
} 
+0

你也主要住在IRC(而不是SO)像@Jaykul?:) – stej 2011-04-01 05:35:32

+0

是的,類似的東西。 – JasonMArcher 2011-04-01 05:45:40

0

我看到你試着解析html。你有沒有考慮將html轉換爲xml並使用xpath或簡單的的方法?

前一段時間我寫了一篇關於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