Цикл по CSV, редактирование полей на основе условий и выражений - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь импортировать CSV и перебирать его, устанавливая новое значение в поле на основе некоторых математических + условных выражений.Это то, что у меня есть:

import-csv "$folder\test2.csv" | ForEach-Object {
  if ($_.SubmissionID -ne "" -and $_.SubmissionID -ne "SubmissionID"){
    echo $_
    $totaldocs = $_.TotalDocs
    $addnpages = $_.AddnPages
    if ($_.SubmitterName -match "check|Check"){
    echo "YES"
    $_.Cost = ([int]$totaldocs * .09)
    }
    if ($_.SubmitterName -notmatch "check|Check"){
    echo "NO"
    $_.Cost = (([int]$totaldocs + [int]$addnpages) * .05)
    }
    echo $_.Cost
  }
} |
export-csv "$folder\test3.csv" -NoTypeInformation

Отладка этого чанка. Я вижу, что поле «Стоимость» устанавливается, однако при экспорте окончательного CSV изменения не сохраняются.Не только это, но есть дополнительные пустые строки между каждой строкой.

Есть ли что-то, чего мне не хватает?Я открыт для предложений, если есть лучший способ сделать это.

1 Ответ

0 голосов
/ 26 октября 2018

Если ваш входной CSV-файл выглядит примерно так:

"SubmissionID","SubmitterName","TotalDocs","AddnPages","Cost"
"abcdef", "Check", "12", "3", "5"
"ghijkl", "check", "10", "7", "25"

Код ниже будет делать то, что вы просите (если я правильно понимаю вопрос)

Import-Csv "$folder\test2.csv" | ForEach-Object {
  if (!([string]::IsNullOrEmpty($_.SubmissionID)) -and $_.SubmissionID -ne "SubmissionID"){
    $totaldocs = $_.TotalDocs
    $addnpages = $_.AddnPages
    if ($_.SubmitterName -match "check") {  # -match is case-insensitive
        $_.Cost = ([int]$totaldocs * .09)
    }
    else {
        $_.Cost = (([int]$totaldocs + [int]$addnpages) * .05)
    }
    ###############################################################
    # output the result. This is what you forgot in the original code
    ###############################################################
    $_
  }
} | Export-Csv "$folder\test3.csv" -NoTypeInformation

Выход:

"SubmissionID","SubmitterName","TotalDocs","AddnPages","Cost"
"abcdef","Check","12","3","1.08"
"ghijkl","check","10","7","0.9"

EDIT

Хорошее наблюдение со стороны LotPings:

Приведенный выше код пропустит строки, не прошедшие тест:

if (!([string]::IsNullOrEmpty($_.SubmissionID)) -and $_.SubmissionID -ne "SubmissionID")

Если вы хотите, чтобы эти строки также были включены в выходной файл, мы перемещаем (выводим) $_ на один шаг вниз. Код становится:

Import-Csv "$folder\test2.csv" | ForEach-Object {
  if (!([string]::IsNullOrEmpty($_.SubmissionID)) -and $_.SubmissionID -ne "SubmissionID"){
    $totaldocs = $_.TotalDocs
    $addnpages = $_.AddnPages
    if ($_.SubmitterName -match "check") {  # -match is case-insensitive
        $_.Cost = ([int]$totaldocs * .09)
    }
    else {
        $_.Cost = (([int]$totaldocs + [int]$addnpages) * .05)
    }
  }
  ###############################################################
  # output the result, changed or not.
  ###############################################################
  $_
} | Export-Csv "$folder\test3.csv" -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...