我有一个关于我想要转换为带有标题的CSV文件的文本文件的问题。
原始文本文件如下所示:
StepStartTime: 2/1/2016 12:02:03 PM StepStopTime: 2/1/2016 12:02:06 PM StepNumber: 1 NextStepNumber: 2 --------------------------------------------------------------- StepStartTime: 2/1/2016 12:02:06 PM StepStopTime: 2/1/2016 12:02:07 PM StepNumber: 2 NextStepNumber: 3 --------------------------------------------------------------- StepStartTime: 2/1/2016 12:02:07 PM StepStopTime: 2/1/2016 12:02:08 PM StepNumber: 3 NextStepNumber: 4 ---------------------------------------------------------------
我想得的是以下内容:
StepStartTime,StepStopTime,StepNumber,NextStepNumber 2/1/2016 12:02:03 PM,2/1/2016 12:02:06 PM,1,2 2/1/2016 12:02:06 PM,2/1/2016 12:02:07 PM,2,3 2/1/2016 12:02:07 PM,2/1/2016 12:02:08 PM,3,4
我试图让它在PowerShell中运行但到目前为止没有运气。我可以在基本级别上阅读代码,但是自己组合不同的行为是一步到位。
答案 0 :(得分:5)
将输入读入字符串并将其拆分为分隔线
(Get-Content 'C:\path\to\input.txt' -Raw) -split '-{63}'
所以你得到这样的片段:
StepStartTime: 2/1/2016 12:02:07 PM StepStopTime: 2/1/2016 12:02:08 PM StepNumber: 3 NextStepNumber: 4
将冒号更改为=
个字符,因此您可以通过ConvertFrom-StringData
将代码段转换为哈希表:
$snippet -replace ': ', '=' | ConvertFrom-StringData
每个代码段会为您提供类似的内容:
Name Value ---- ----- StepStopTime 2/1/2016 12:02:08 PM StepNumber 3 NextStepNumber 4 StepStartTime 2/1/2016 12:02:07 PM
从哈希表中创建自定义对象:
New-Object -Type PSObject -Property $hashtable
获取可以导出为CSV的格式:
StepStopTime StepNumber NextStepNumber StepStartTime ------------ ---------- -------------- ------------- 2/1/2016 12:02:08 PM 3 4 2/1/2016 12:02:07 PM
完整代码:
(Get-Content 'C:\path\to\input.txt' -Raw) -split '-{63}' | Where-Object {
$_.Trim()
} | ForEach-Object {
$props = $_.Trim() -replace ': ', '=' | ConvertFrom-StringData
New-Object -Type PSObject -Property $props
} | Export-Csv 'C:\path\to\output.csv' -NoType
注意:如果您仍在使用PowerShell v2,则需要更换
Get-Content 'C:\path\to\input.txt' -Raw
类似
Get-Content 'C:\path\to\input.txt' | Out-String
将文件的内容作为单个字符串。在PowerShell v3之前,参数-Raw
不可用。