将 header 行添加到 .csv

Add header row to .csv

我知道这是一个非常常见的问题,但是 none 在我发现的问题中有效的解决方案对我有效。我有一个 powershell 脚本,它创建一个 .csv 文件(使用 new-item),然后用四列信息填充它(使用 add-content)。我想添加到此脚本以将 header 添加到 .csv,以便我可以进一步解析它并通过其中一列的内容分隔信息,但是我尝试过的任何操作都不起作用。我尝试使用 -value 参数使 csv 的第一行成为我想要的 headers,这正在努力将 header 放在正确的列中,但是第一行的信息是通过 add-content 添加将进入 header 行。 示例:

Desired output:
Header | Header | Header | Header
Info   | Info   | Info   | Info
Info   | Info   | Info   | Info
Actual Output:
Header | Header | Header | Header | Info   | Info   | Info   | Info   |
Info   | Info   | Info   | Info   |

我也尝试过使用 import-csv 并以这种方式添加 header,然后将输出通过管道传输到 export-csv,但是每次都返回一个空白的 .csv。我为此使用的代码:

Import-Csv $file -header "Header,Header,Header,Header" |export-csv $file -notypeinformation

按照我的看法,我需要在执行 add-content 时跳过第一行,但是我对 powershell 还很陌生,不知道该怎么做。我已经在这个问题上绕了一段时间了,所以任何意见都将不胜感激。

** 编辑 **

TheMadTechnician 的回答解决了这个问题,在他们回答的后半部分粘贴了当前工作的代码。解析一个csv是比较简单的脚本,检查有没有tracking number,有没有查ups网站,如果投递定金在csv,如果投递异常定金在其他csv:

$file= import-csv "**FILEPATH**\Intransit_report.csv"
$newfile= New-Item "**FILEPATH**$(get-date -format dd-MM-yyyy)_delivered.csv" -type file -force -value "Tag Number,Final Dest,Tracking ID,Attribute Ref #`n"
$exceptionfile= New-Item "**FILEPATH**$(get-date -format dd-MM-yyyy)_delivery_exceptions.csv" -type file -force -value "Tag Number,Final Dest,Tracking ID,Attribute Ref #`n"
foreach ($i in $file) {
    $tagnum= $i | select-object -expandproperty "Tag Number"
    $trackingid = $i | select-object -expandproperty "Tracking ID"
    $refnum= $i | select-object -expandproperty "Attribute Ref #"
    $findest= $i | select-object -expandproperty "Final Dest"
    if ($trackingid.length -gt 1){
        $uri= "**URI**$trackingid"
        $html= Invoke-Webrequest -URI $uri
        $fields= $HTML.ParsedHtml
        $trackstate= $fields.getElementByID("ttc_tt_spStatus")
        if($trackstate.innerText -like "*Business Days*"){
        break}
        elseif($trackstate.innerText -like "Delivered*"){
            "$tagnum, $findest, $trackingid, $refnum" | Add-Content $newfile
        }
        elseif($trackstate.innerText -like "*Attempt Made*"){
            "$tagnum, $findest, $trackingid, $refnum" | Add-Content $exceptionfile
        }
    }
}

我有一个简单的答案,而且是一个很好的答案。简单的答案是将 `n 添加到您的 -value 参数中。

New-Item C:\Path\To\File.csv -value "Header,Header,Header,Header`n"

这只是将换行符附加到 header 文本的末尾,之后添加的任何内容都在下一行。

更好的答案是您可能正在以艰难的方式处理事情。我建议不要多次向文件中添加内容,而是收集数据(除非有大量数据),然后在最后一次输出所有数据。如果您要制作 CSV,您应该制作一个 objects 数组,然后在最后导出那些 objects。如果没有更多关于您正在做的事情的数据,就很难给出一个您可以与之相关的可行示例。如果您想了解更多信息,请告诉我,并用更多代码显示您在做什么来更新您的问题。

编辑: 看看你有什么,我想我只需为每个项目添加一个状态 属性,然后在最后为每个项目导出一次文件过滤状态。像这样:

$file= import-csv "**FILEPATH**\Intransit_report.csv"
foreach ($i in ($file | Where{$_.'Tracking ID'})) {
    $trackingid = $i | select-object -expandproperty "Tracking ID"
    $uri= "**URI**$trackingid"
    $html= Invoke-Webrequest -URI $uri
    $fields= $HTML.ParsedHtml
    $trackstate= $fields.getElementByID("ttc_tt_spStatus")
    Switch -Regex ($trackstate.innerText){
        "Business Days" {Add-Member -InputObject $i -NotePropertyName 'Status' -NotePropertyValue 'In Transit';Continue}
        "Delivered" {Add-Member -InputObject $i -NotePropertyName 'Status' -NotePropertyValue 'Delivered';Continue}
        "Attempt Made" {Add-Member -InputObject $i -NotePropertyName 'Status' -NotePropertyValue 'Attempt Made'}
    }
}

$file | Where{$_.Status -eq 'Delivered'} | Select 'Tag Number','Final Dest','Tracking ID','Attribute Ref #' | Export-CSV "**FILEPATH**$(get-date -format dd-MM-yyyy)_delivered.csv" -NoTypeInformation
$file | Where{$_.Status -eq 'Attempt Made'} | Select 'Tag Number','Final Dest','Tracking ID','Attribute Ref #' | Export-CSV "**FILEPATH**$(get-date -format dd-MM-yyyy)_delivery_exceptions.csv" -NoTypeInformation

这样它一次完成所有处理,然后写入两次,而不是写入驱动器 X 次,其中 X 是已经交付或尝试交付的项目数.