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

时间:2018-09-13 20:49:51

标签: powershell powershell-v5.0

因此,我尝试处理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 :(得分: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 :(得分: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
}

答案 2 :(得分:1)

Get-ChildItem在这种情况下非常有用。

您可以将通配符直接添加到路径中:

 try {
        WeatherAPI.Creater.newApiCreator().getopenweather(,WeatherAPI.WetherAPIKey)
                .subscribeOn(Schedulers.io())
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe({});

    } catch (Exception e) {
        e.printStackTrace();
    }

您可以递归路径并使用提供程序来过滤文件:

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

这应该可以满足您的需求。

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

此外,在使用Powershell时,请避免执行以下操作:

$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