Как мне обработать несколько файлов CSV в Powershell и дать им выходные имена? - PullRequest
0 голосов
/ 13 сентября 2018

Итак, я пытаюсь обработать CSV-файлы, а затем задаю новое имя для вывода.Я могу сделать это с одним файлом, явно указав имя файла.Но есть ли способ / подстановочный знак, который я могу использовать, чтобы скрипт обрабатывал несколько файлов одновременно?Скажем так, я хочу обработать что-нибудь с расширением .csv.Вот мой скрипт, который используется для обработки определенного файла

$objs =@();
$output = Import-csv -Path D:\TEP\FilesProcessing\Test\file1.csv | ForEach { 
$Object = New-Object PSObject -Property @{
        Time = $_.READ_DTTM
        Value = $_.{VALUE(KWH)}    
        Tag  = [String]::Concat($_.SUBSTATION,'_',$_.CIRCUITNAME,'_',$_.PHASE,'_',$_.METERID,'_KWH')

    }   
    $objs += $Object;
} 
$objs 
$objs | Export-CSv -NoTypeInformation D:\TEP\FilesProcessing\Test\file1_out.csv

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Используйте Get-Childitem и вырежьте все ненужные промежуточные переменные, чтобы вы кодировали его более похожим на Powershell способом. Как то так:

Get-CHhilditems 'D:\TEP\FilesProcessing\Test\*.csv' | % {
    Import-csv $_.FullName | % {
        New-Object PSObject -Property @{
            Time = $_.READ_DTTM
            Value = $_.{VALUE(KWH)}    
            Tag  = '{0}_{1}_{2}_{3}_KWH' -f $_.SUBSTATION, $_.CIRCUITNAME, $_.PHASE, $_.METERID
        }
    } | Export-CSv ($_.FullName -replace '\.csv', '_out.csv') -NoTypeInformation
}
0 голосов
/ 14 сентября 2018

Get-ChildItem очень полезен для подобных ситуаций.

Вы можете добавлять символы подстановки прямо в путь:

Get-ChildItem -Path D:\TEP\FilesProcessing\Test\*.csv

Вы можете найти путь и использовать поставщика для фильтрации файлов:

Get-ChildItem -Path D:\TEP\FilesProcessing\Test\ -recurse -include *.csv

Это должно дать вам то, что вам нужно.

$Props = @{
    Time = [datetime]::Parse($_.READ_DTTM)
    Value = $_.{VALUE(KWH)}
    Tag  = $_.SUBSTATION,$_.CIRCUITNAME,$_.PHASE,$_.METERID,'KWH' -join "_"
}  
$data = Get-ChildItem -Path D:\TEP\FilesProcessing\Test\*.csv | Foreach-Object {Import-CSV -Path $_.FullName}
$data | Select-Object -Property $Props | Export-CSv -NoTypeInformation D:\TEP\FilesProcessing\Test\file1_out.csv

Также при использовании Powershell избегайте следующих действий:

$objs =@();
$objs += $Object;
0 голосов
/ 13 сентября 2018

Вы можете комбинировать Get-ChildItem и Import-Csv.

Вот пример, который определяет различные каталоги ввода и вывода, чтобы избежать конфликтов имен:

$inputPath = "D:\TEP\FilesProcessing\Test"
$outputPath = "D:\TEP\FilesProcessing\Output"
Get-ChildItem (Join-Path $inputPath "*.csv") | ForEach-Object {
  $outputFilename = Join-Path $outputPath $_.Name
  Import-Csv $_.FullName | ForEach-Object {
    New-Object PSObject -Property @{
      "Time"  = $_.READ_DTTM
      "Value" = $_.{VALUE(KWH)}
      "Tag"   = "{0}_{1}_{2}_{3}_KWH" -f $_.SUBSTATION,$_.CIRCUITNAME,$_.PHASE,$_.METERID
    }
  } | Export-Csv $outputFilename -NoTypeInformation
}

Обратите внимание, что в этом нет необходимостисоздание массива и повторное добавление его.Просто выведите нужные вам объекты и экспортируйте их потом.

...