2017-01-12 3 views
0

Я понимаю, что это очень часто задаваемый вопрос, однако ни одно из решений, которые работали в вопросах, которые я нашел, не сработало для меня. У меня есть сценарий powershell, который создает CSV-файл (с использованием нового элемента), а затем заполняет его четырьмя столбцами информации (используя add-content). Я хотел бы добавить к этому скрипту, чтобы добавить заголовок в .csv, чтобы я мог еще раз проанализировать его и отделить информацию по содержимому одного из столбцов, однако ничто из того, что я пробовал, работает. Я попытался использовать параметр -value, чтобы сделать первую строку csv заголовками, которые я хочу, которая работает, чтобы поместить заголовок в правильные столбцы, однако первая строка информации, которая добавляется через add-content, входит в строка заголовка. Пример:Добавить строку заголовка в .csv

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 и не знаю, как сделать это. Я собираюсь в кругах об этом какое-то время, так что любой вклад будет очень оценен.

** EDIT **

Ответа на этот вопрос TheMadTechnician исправили вопрос, вставляя в настоящее время рабочий код за вторую половину своего ответа. Это относительно простой скрипт для разбора CSV, проверьте, есть ли идентификационный номер, если есть проверка на веб-сайт взлетов, если они доставлены депозит в 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 
     } 
    } 
} 
+0

Почему сценарий должен использовать новый элемент или добавочный контент? Не можете ли вы использовать Export-Csv -Append? ИЛИ в прошлом я только что сохранил свои данные в переменной. Затем каждый раз, когда мой скрипт меняет что-то, я просто экспортирую исходный файл. –

ответ

2

I» у вас есть легкий ответ и хороший ответ. Легким ответом является добавление `n к вашему параметру -value.

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 количество раз, где Х представляет собой число элементов, которые либо уже доставлены или были предприняты попытки доставки.

+0

Это сработало отлично для меня. Спасибо! – Cameron

+0

Кроме того, что касается того, почему я это делаю, то короткий ответ заключается в том, что я работаю с большими объемами данных (проверяя номера отслеживания для того, поставляются ли они или нет для компании, которая отправляет несколько тысяч партий в неделю). Однако, если есть более простой способ, я был бы рад услышать это, поскольку я совершенно новый для powershell. – Cameron

Смежные вопросы