2017-09-15 95 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