将CSV列拆分为两列

时间:2017-03-06 22:07:28

标签: powershell csv

尝试将连字符中的列SchedTime拆分为两列。

示例数据:

SchedTime,Data2,Data3
00:00-00:30,blah,alsoblah
08:00-08:30,yadda,yaddayadda

期望的结果:

SchedTime,Data2,Data3,Start,End
00:00-00:30,blah,alsoblah,00:00,00:30
08:00-08:30,yadda,yaddayadda,08:00,08:30

尝试:

Import-Csv $SAMTemp | foreach {
    $Start, $End = $_.SchedTime.Split("-")

    $_ | Add-Member -MemberType NoteProperty -Name Start -Value $Start
    $_ | Add-Member -MemberType NoteProperty -Name End -Value $End
} | Export-Csv $SAMTemp2 -NoTypeInformation

我的结果是一个空白的CSV文件。

我想将数据附加到原始CSV,但到目前为止,如果我尝试将其写入自己的文件,我会得到一个空白的结果。

我关注this,但没有运气。

1 个答案:

答案 0 :(得分:2)

您不会将修改后的对象输出回管道,因此您的输入会被静默丢弃。在循环结束时添加$_以解决此问题(在问题的评论中建议为@wOxxOm):

Import-Csv ... | foreach {
    ...
    $_
} | Export-Csv ...

话虽如此,您也可以使用calculated properties来获得所需的结果:

Import-Csv ... |
    Select-Object *,
        @{n='Start';e={$_.SchedTime.Split('-')[0]}},
        @{n='End';e={$_.SchedTime.Split('-')[1]}} |
    Export-Csv ...

附录:如果您要附加到原始文件,则无法使用Export-Csv。即使您在处理内容之前完全阅读文件也能正确执行此操作:

(Import-Csv your.csv) | ... | Export-Csv your.csv -NoType -Append

结果将不是您所期望的。这是因为PowerShell确定了列表中第一个对象的输出字段(在附加到CSV的情况下是CSV中的第一个记录)。这意味着不会将其他字段写入文件。

你可以解决这个问题:

(Import-Csv your.csv) | ... |
    ConvertTo-Csv -NoType |
    Select-Object -Skip 1 |
    Add-Content your.csv

但即使正在写入实际值,这仍然会使CSV中缺少新的列标题。

我的建议是将修改后的内容与原始内容分开(即将修改后的记录写入新文件)。如果必须附加到原始文件,请在附加修改后的记录之前将新列添加到原始记录中,例如:像这样:

$csv = Import-Csv your.csv -Header 'SchedTime','Data2','Data3','Start','End'

$csv | Export-Csv your.csv -NoType

$csv | ForEach-Object {
    $Start, $End = $_.SchedTime.Split("-")
    $_.Start = $Start
    $_.End   = $End
    $_
} | Export-Csv your.csv -NoType -Append