Необходимо обновить строки в CSV с помощью PowerShell - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть список свойств документа в CSV, который содержит разные значения метаданных для каждого года, и мне нужно обновлять его по строкам за строками.

Example :
FileName                   Year                Department            Owner
----------------------------------------------------------------------------------  
Invoice_SIMS               2019                Sales                 Alan
Invoice_SIMS               2018                Sales                 Alan
Invoice_SIMS               2016                Sales APAC            Elizabeth
Invoice_SIMS               2016                Sales Singapore       Michele
Invoice_SIMS               2016                Sales Singapore       Michele
Invoice_PAS                2020                Sales Europe          Abraham
Invoice_PAS                2018                Sales APAC            Tan
Invoice_PAS                2017                Sales Singapore       Lim'

Мне нужно обновить нижеприведенную информацию, полученную из CSV, которые встречают самый высокий рейтинг "Год" для этих файлов.

Например. Invoice_SIMS имеет наибольшее значение для года, самое высокое - 2019, и он обновит последние метаданные до версии предыдущего года.

Образцы данных, которые я пытаюсь получить в PowerShell

FileName                   Year                    Department             Owner
------------------------------------------------------------------------------------  
Invoice_SIMS               2019                      Sales                 Alan
Invoice_SIMS               2018                      Sales                 Alan
Invoice_SIMS               2016                      Sales                 Alan
Invoice_SIMS               2016                      Sales                 Alan
Invoice_SIMS               2019                      Sales                 Alan
Invoice_PAS                2020                      Sales Europe          Abraham
Invoice_PAS                2020                      Sales Europe          Abraham
Invoice_PAS                2020                      Sales Europe          Abraham

Год будет Поддерживайте любые основные / уникальные метаданные для этого имени файла.

Спасибо.

Обновление - мой код следующий. Но я застрял, пытаясь обновить оставшиеся документы и экспортировать в Excel.

$SpreedsheetPath =".\SalesReport.csv"

function Get-HighestYearMetadata{
    param(
        [Parameter(Mandatory = $true)] [string] $SpreedsheetPath
    )
    if ($SpreedsheetPath -ne $null)
    {
        Write-Output 'Analysing highest Year for each documents..'

        #Generate the list of documents that have the highest Year
        $FinalReport = Import-Csv $SpreedsheetPath 
        $FinalReportGrouped = $FinalReport | Group-Object {$_.FileName}
        ForEach ($item in $FinalReportGrouped) {
            $item.Group | Sort-Object -Descending -Property Year | Select-Object -First 1 
        }

        #2. Get the metadata for the document and assign to the remaining document that have same filename
        foreach ($row in $FinalReportGrouped) 
        {
          $FinalReport | Where {$_.FileName -eq $row.FileName}  
          {
              Write-Output 'Output Department : '  $row.Department
              Write-Output 'Output Owner : ' $row.Owner
              $_.Department = $row.Department
              $_.Owner = $row.Owner
          }
        }
        Write-Output 'Exporting CSV'
        $FinalReport | Export-Csv -LiteralPath $DestinationPath -Encoding UTF8 -NoTypeInformation
    }
    else
    {
        Write-Output 'Error : File Path is empty'
    }  
}



Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Если мы предположим, что File.csv содержит ваши данные в формате с разделителями-запятыми, вы можете сделать следующее.

$data = Import-Csv File.csv
$dataToCopy = $data | Group-Object FileName | Foreach-Object {
    $_.Group | Sort Year -Desc | Select -First 1 
}
foreach ($row in $dataToCopy) {
    $data | Where {$_.FileName -eq $row.FileName} | Foreach-Object {
        $_.Department = $row.Department
        $_.Owner = $row.Owner
    }
}
$data | Export-Csv NewFile.csv -NoType

Приведенное выше решение сохраняет текущую сортировку данных.

0 голосов
/ 10 февраля 2020

Вы можете использовать командлет Sort-Object и некоторый код для получения желаемого результата.

# test data creation
$csv = @'
Invoice_SIMS               2019                Sales                 Alan
Invoice_SIMS               2018                Sales                 Alan
Invoice_SIMS               2016                Sales APAC            Elizabeth
Invoice_SIMS               2016                Sales Singapore       Michele
Invoice_SIMS               2016                Sales Singapore       Michele
Invoice_PAS                2020                Sales Europe          Abraham
Invoice_PAS                2018                Sales APAC            Tan
Invoice_PAS                2017                Sales Singapore       Lim
'@ -split [System.Environment]::NewLine
$csv = $csv | ForEach-Object -Process {$_ -split ' {2,}' -join ','}
$csv = ConvertFrom-Csv -InputObject $csv -Header FileName, Year, Department, Owner
# get the name of a temporary file for storing changed test data
$tempcsvfilename = [System.IO.Path]::GetTempFileName()
# modify test data and save it in a temporary file
$curr_filename = ''
$csv | Sort-Object -Property FileName, Year -Descending |
  ForEach-Object -Process {
    if ( $_.FileName -ne $curr_filename ) {
      $curr_filename, $dept, $owner = $_.FileName, $_.Department, $_.Owner
    } else {
      $_.Department, $_.Owner = $dept, $owner
    }
    $_
  } | Export-Csv -LiteralPath $tempcsvfilename -Encoding UTF8 -NoTypeInformation
  # view modified test data
  Get-Content -LiteralPath $tempcsvfilename -Encoding UTF8

Вывод:

"FileName","Year","Department","Owner"
"Invoice_SIMS","2019","Sales","Alan"
"Invoice_SIMS","2018","Sales","Alan"
"Invoice_SIMS","2016","Sales","Alan"
"Invoice_SIMS","2016","Sales","Alan"
"Invoice_SIMS","2016","Sales","Alan"
"Invoice_PAS","2020","Sales Europe","Abraham"
"Invoice_PAS","2018","Sales Europe","Abraham"
"Invoice_PAS","2017","Sales Europe","Abraham"
...