文本文件到带有标题的CSV文件

时间:2016-02-02 09:39:30

标签: csv powershell text

我有一个关于我想要转换为带有标题的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中运行但到目前为止没有运气。我可以在基本级别上阅读代码,但是自己组合不同的行为是一步到位。

1 个答案:

答案 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不可用。