尝试将连字符中的列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,但没有运气。
答案 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