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

Rud*_*y86 1 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中工作但到目前为止没有运气.我可以在基本级别阅读代码,但是自己组合不同的行为是向前迈进的一步.

Ans*_*ers 5

将输入读入字符串并将其拆分为分隔线

(Get-Content 'C:\path\to\input.txt' -Raw) -split '-{63}'
Run Code Online (Sandbox Code Playgroud)

所以你得到这样的片段:

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
Run Code Online (Sandbox Code Playgroud)

对于每个片段,这将为您提供类似的内容:

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
Run Code Online (Sandbox Code Playgroud)

获取可以导出为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
Run Code Online (Sandbox Code Playgroud)

注意:如果您仍在使用PowerShell v2,则需要更换

Get-Content 'C:\path\to\input.txt' -Raw
Run Code Online (Sandbox Code Playgroud)

喜欢的东西

Get-Content 'C:\path\to\input.txt' | Out-String
Run Code Online (Sandbox Code Playgroud)

将文件的内容作为单个字符串.-Raw在PowerShell v3之前,该参数不可用.