将标题行添加到.csv

时间:2017-01-12 21:16:47

标签: powershell csv powershell-v5.0

我意识到这是一个非常常见的问题,但是我发现的问题中没有一个解决方案对我有用。我有一个powershell脚本,它创建一个.csv文件(使用new-item),然后用四列信息填充它(使用add-content)。我想添加到这个脚本中为.csv添加一个标题,这样我就可以进一步解析它并将其中一个列的内容分开,但是我没有尝试过。我已经尝试使用-value参数使csv的第一行成为我想要的标题,这样可以将标题放在正确的列中,但是通过add-content添加的第一行信息将进入标题行。 例如:

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并添加一个标题,然后将输出汇总到export-csv,但每次都返回一个空白.csv。我用过的代码:

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

我看到它的方式我需要在添加内容时跳过第一行,但是我对powershell很新,并且不知道该怎么做。我已经在这方面做了一段时间了,所以任何意见都会非常感激。

**编辑**

TheMadTechnician的回答解决了这个问题,每秒回答当前工作代码的答案。这是一个相对简单的脚本来解析csv,检查是否有跟踪号码,如果有针对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
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我有一个简单的答案,一个很好的答案。简单的答案是在你的-value参数中添加`n。

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

只需将新行字符附加到标题文本的末尾,然后在下一行添加任何内容。

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

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

$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是已经交付或已经进行了交付尝试的项目数。 / p>

相关问题