【问题标题】:How to convert a plain text into a structured PowerShell object如何将纯文本转换为结构化的 PowerShell 对象
【发布时间】:2017-09-15 23:08:09
【问题描述】:

我有一个通用文本,不是 PSCustom,不是 CSV,不是 JSON,但有一些结构

字段1:ABC 字段 2:DEF 字段1:HKA 字段3:YZ 字段 1:123 字段 2:234 场 4:876 领域5:徐志

显然,文本是多条记录,有字段和缺失字段,每条记录用CR-LF分隔。

是否有一种有效的方法来解析字符串并仅从记录中提取 Field1Field2 并将结果放入 JSON 中?

我尝试将字符串放入一个名为 $s 的字符串变量中

$s | select -ExpandProperty Field1,Field2

但我得到了这个错误

Select-Object:无法将“System.Object[]”转换为参数“ExpandProperty”所需的类型“System.String”。不支持指定的方法。

如果我尝试过

$s | select -ExpandProperty Field1

然后我收到错误消息说 Field1 不是属性。

我想我有点理解这个错误,但不知道如何修复它。我想我必须先以某种方式将文本转换为结构化表格,然后再提取它。但是我该怎么做呢?

【问题讨论】:

  • 您正在尝试扩展字符串上的“属性”。这行不通。您必须创建一个 PSCustom 对象并将值放入该对象中,然后您可以在管道中使用它并以这种方式扩展属性。我能想到的解决方案是将新行上的字符串拆分为一个数组,并在其上使用 foreach 循环来创建您的自定义对象。
  • 我还注意到您有多个字段 1 和 2 等等....您提供的这个示例正确吗?
  • @ArcSet:是的。 “纯文本”实际上不是纯文本,而是结构化文本。它们是带有 field1、field2、...、fieldn 的记录。有些字段显示是因为它们有值,有些则没有,因为它们是空白的。但我只对特定领域感兴趣,比如 field1 和 field2。如果它们是空白的,那么我会在值中留出空格。

标签: powershell


【解决方案1】:

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

【讨论】:

  • 谢谢!那很漂亮...但是,由于某种原因,在运行脚本后,所有记录中的字段仅合并为一条记录...所以 $ht 只是 Field1 到 Field5 的一条记录,而我正在寻找的是 $ ht[0]={Field1:..,Field2}, $ht[1]={Field1...,Field3],$ht[3]={...}.... 我可能需要扭曲你的编写代码来得到我想要的东西,但至少我明白了应该做什么!
  • 很可能你没有为每个片段创建一个新的哈希表
  • 啊……大概就是这样!我是新手,仍在学习我的绳索
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多