我有一个进程解析出大量CSV文档并保存更改,以便以后在数据库中处理。当在人员数据库中找不到任何CSV中的一行(一个人)时,该过程将从CSV中保存该记录。我目前将它保存为哈希表的字符串输出。所以CSV文件
First,Last,Office
Joe,Smith,Detroit
在VS 2015中使用调试器时import-csv "path to my doc.csv"
的输出字符串可视化为:
@{First=Joe; Last=Smith; Office=Detroit;}
它还扩展为键/值集:
First | Joe
Last | Smith
Office | Detroit
在powershell中,我能够将表中的名称对象用作$obj.First
并继续使用。但是我无法将该字符串保存到数据库中,并将其作为可用的PowerShell对象恢复。我总是以字符串文字结尾。
有没有办法将此字符串转换回哈希表或其他键/值对?
我试过这个:
$data = ConvertFrom-String $raw -PropertyNames First,Last,Office
我已经在原始字符串上尝试了这个,它只返回字符串,其中包含属性名称。我还将原始哈希转换为数组:
[string[]]$l_array = $raw | out-string
然后,当我使用ConvertFrom-String
命令将其转换回来时,实际上它正在移动数据元素并添加键作为值。
感谢您的帮助。我可以根据需要提供更多详细信息或示例代码。
编辑 另一方面,我怎样才能以更好的格式存储当前PSCustomObject的数据,我可以将其重建为相同的PSCustomObject?我想也许Export-Csv可能有用,但你不能导出到字符串。至少据我所知。
答案 0 :(得分:0)
您正在寻找的是序列化。一种直接的方法是使用内置对象序列化cmdlet:Export-CliXml
和Import-CliXml
。
前者会将您的对象保存为XML文件。这可以保存在磁盘上以及数据库中。稍后需要该对象时,检索XML文档并通过反序列化重新创建该对象。像这样,
# Create simple object
$o = New-Object -TypeName PSObject
$o | Add-Member -Name "Attr1" -Value "Val1" -MemberType NoteProperty
$o | Add-Member -Name "Attr2" -Value "Val2" -MemberType NoteProperty
$o
Attr1 Attr2
----- -----
Val1 Val2
# Serialize it
Export-Clixml -Path ./myObj.xml -InputObject $o
# Deserialize as another object, print it
$p = Import-Clixml -Path .\myObj.xml
$p
Attr1 Attr2
----- -----
Val1 Val2
# Look at file contents for magic!
Get-Content .\myObj.xml
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
<Obj RefId="0">
<TN RefId="0">
<T>System.Management.Automation.PSCustomObject</T>
<T>System.Object</T>
</TN>
<MS>
<S N="Attr1">Val1</S>
<S N="Attr2">Val2</S>
</MS>
</Obj>
</Objs>