将 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 是已经交付或尝试交付的项目数.
我知道这是一个非常常见的问题,但是 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 是已经交付或尝试交付的项目数.