Powershell 将CSV列一分为二

Powershell 将CSV列一分为二,powershell,csv,Powershell,Csv,正在尝试将连字符处的列SchedTime拆分为两列 示例数据: SchedTime,Data2,Data3 00:00-00:30,blah,alsoblah 08:00-08:30,yadda,yaddayadda 我的结果是一个空白的CSV文件 我想将数据附加到原始CSV,但到目前为止,如果我尝试将其写入自己的文件,我会得到一个空白结果 我一直在跟踪,但运气不好。您没有将修改后的对象输出回管道,因此您的输入会被默默地丢弃。在循环的末尾添加一个$\uu,以解决此问题(如问题注释中所建议的):

正在尝试将连字符处的列
SchedTime
拆分为两列

示例数据:

SchedTime,Data2,Data3 00:00-00:30,blah,alsoblah 08:00-08:30,yadda,yaddayadda 我的结果是一个空白的CSV文件

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


我一直在跟踪,但运气不好。

您没有将修改后的对象输出回管道,因此您的输入会被默默地丢弃。在循环的末尾添加一个
$\uu
,以解决此问题(如问题注释中所建议的):

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

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 ... |
    Select-Object *,
        @{n='Start';e={$_.SchedTime.Split('-')[0]}},
        @{n='End';e={$_.SchedTime.Split('-')[1]}} |
    Export-Csv ...
附录:如果要附加到原始文件,则不能使用
导出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 = 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
但这仍然会使CSV中缺少新的列标题,即使正在编写实际值

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

(Import-Csv your.csv) | ... |
    ConvertTo-Csv -NoType |
    Select-Object -Skip 1 |
    Add-Content your.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

您不会将修改后的对象输出回管道,因此您的输入会被默默地丢弃。在循环的末尾添加一个
$\uu
,以解决此问题(如问题注释中所建议的):

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

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 ... |
    Select-Object *,
        @{n='Start';e={$_.SchedTime.Split('-')[0]}},
        @{n='End';e={$_.SchedTime.Split('-')[1]}} |
    Export-Csv ...
附录:如果要附加到原始文件,则不能使用
导出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 = 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
但这仍然会使CSV中缺少新的列标题,即使正在编写实际值

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

(Import-Csv your.csv) | ... |
    ConvertTo-Csv -NoType |
    Select-Object -Skip 1 |
    Add-Content your.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

foreach
应该产生一些输出:在
}
foreach
之前添加一行带有
$的新行
应该产生一些输出:在
}
之前添加一行带有
$
的新行谢谢!我不想费心添加,但我很感激。谢谢!我不想费心添加,但我很感激。