2017-09-15 36 views
0

我有一個通用的文本,而不是PSCustom,不是CSV,不是JSON但有一些結構如何將純文本轉換成結構化的PowerShell對象

 
Field1:ABC 
Field2: DEF 

Field1:HKA 
Field3:YZ 

Field1:123 
Field2:234 
Field4:876 
Field5:XUZ 

顯然,文本是一個多條記錄與領域,缺少的字段,每個記錄用CR-LF分隔。

是否有一種有效的方法來解析字符串,並只提取Field1Field2超出記錄並將結果放入JSON中?

我試圖把字符串轉換成所謂$s然後

$s | select -ExpandProperty Field1,Field2 

一個字符串變量,但我得到這個錯誤

選擇-對象:無法將「System.Object的[]」的類型'參數'ExpandProperty'所需的'System.String'。指定的方法不受支持。

如果我試圖

$s | select -ExpandProperty Field1 

然後我得到的錯誤說Field1不是一個性質。

我想我有點理解錯誤,但不知道如何解決它。我想我必須以某種方式將文本轉換爲結構化表格,然後將其解壓縮。但我該怎麼做?

+0

你試圖擴大在字符串中的「財產」。這不起作用。您必須創建一個PSCustom對象並將這些值放入該對象中,然後才能在管道中使用它並以這種方式展開屬性。我能想到的解決方案是將字符串拆分成一個新行,並使用foreach循環創建自定義對象。 –

+0

我也注意到你有多域field1和2's等等......這個樣本是否正確? – ArcSet

+0

@ArcSet:是的。 「純文本」實際上不是純文本,而是結構化的文本。它們是帶有field1,field2,...,fieldn的記錄。有些字段因爲有價值而顯示,有些字段因爲空白而顯示。但我只對特定的領域感興趣,比如說field1和field2。如果它們是空白的,那麼我會在價值中留下空間。 – user1205746

回答

3

Select-Object對字符串不起作用。您需要首先將字符串處理爲對象列表。此外,您無法一次擴展多個媒體資源。

拆分文本在連續2+換行符:

(Get-Content 'C:\temp\input.txt' | Out-String) -split '(\r?\n){2,}' 

拆分各片段插入線,分割在隔板的每一行,並填充哈希表用鍵/值對:

$ht = @{} 
$fragment -split '\r?\n' | ForEach-Object { 
    $key, $value = $_ -split '\s*:\s*' 
    $ht[$key] = $value 
} 

然後從散列表構建對象:

New-Object -Type PSObject -Property $ht 

這樣,您可以選擇屬性Field1Field2這樣的:

... | Select-Object Field1, Field2 
+0

謝謝!這是非常光滑的......但是,由於某種原因,在運行腳本之後,所有記錄中的字段僅合併爲一條記錄......$ ht [0] = {Field1:..,Field2},$ ht [1] = {Field1 ...,Field3],$ ht [$]是$ ht只有一個Field1到Field5的記錄, 3] = {...} ....我可能需要把你的代碼扭曲一點才能得到我想要的,但至少我明白了應該做的事情的要點! – user1205746

+0

最有可能你沒有爲每個片段創建一個新的散列表 –

+0

啊......這可能是!我是新人,仍然在學習我的繩索 – user1205746

相關問題