如何在Powershell中处理多个CSV文件并为其提供输出名称?

问题描述 投票:0回答:3

所以我正在尝试处理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
powershell powershell-v5.0
3个回答
1
投票

你可以结合Get-ChildItemImport-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
}

请注意,不需要创建数组并重复附加数组。只需输出您想要的自定义对象并在之后导出。


1
投票

使用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
}

1
投票

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;
© www.soinside.com 2019 - 2024. All rights reserved.