【问题标题】:A more efficient way to import multiple CSV files from a directory从目录导入多个 CSV 文件的更有效方法
【发布时间】:2015-08-18 01:48:41
【问题描述】:

必须有一种更有效的方法将多个 CSV 文件从文件名包含 Services_Results*.csv 的目录导入到一个具有唯一条目的变量中。我正在考虑遍历目录中与通配符匹配的文件名的所有文件,然后只导入 Success 所在的行。

$Success0 = Import-Csv -Path "\\FILE05\Users\USER001\+Projects\Chrome\Services_Results.csv" | Where-Object {$_.Status -eq "Success"}
$Success1 = Import-Csv -Path "\\FILE05\Users\USER001\+Projects\Chrome\Services_Results_150601.csv" | Where-Object {$_.Status -eq "Success"}
$Success2 = Import-Csv -Path "\\FILE05\Users\USER001\+Projects\Chrome\Services_Results_150602.csv" | Where-Object {$_.Status -eq "Success"} 
$Success3 = Import-Csv -Path "\\FILE05\Users\USER001\+Projects\Chrome\Services_Results_150602_b.csv" | Where-Object {$_.Status -eq "Success"} 
$Success4 = Import-Csv -Path "\\FILE05\Users\USER001\+Projects\Chrome\Services_Results_150602_c.csv" | Where-Object {$_.Status -eq "Success"}
$Success5 = Import-Csv -Path "\\FILE05\Users\USER001\+Projects\Chrome\Services_Results_150603_a.csv" | Where-Object {$_.Status -eq "Success"}

$PCList = $Success0 + $Success1 + $Success2 + $Success3 + $Success4 + $Success5
$PCList = $PCList.PC | sort -Unique
Write-host "PCList" $PCList.count

【问题讨论】:

  • $PCList.PC 是包含 PC 名称的字段。当有不止一列数据时,我不知道如何制作唯一条目列表。

标签: powershell csv


【解决方案1】:

我认为你可以用你已经在做的方式非常巧妙地做你想做的事,但是使用通配符和 ForEach 循环:

$files = Get-ChildItem "\\FILE05\Users\USER001\+Projects\Chrome\*.csv"
$PCList = $files | ForEach { (Import-Csv $_ | Where Status -eq "Success") }

$PCList = $PCList | sort -Unique -Property PC
Write-Output $PCList
Write-Output $PCList.Count

【讨论】:

    【解决方案2】:

    如何使用 PowerShell 后台作业来加快进程?我没有测试过这段代码,但尝试阅读理解模式。如果您要导入大型 CSV 文件,我想您会很感激它可以大大加快这个过程。

    ### Create an empty array to hold Background Jobs.
    $JobList = @();
    
    ### Get a list of CSV files.
    $FileList = Get-ChildItem -Path \\FILE05\Users\USER001\+Projects\Chrome\*Services_Results*.csv;
    
    foreach ($File in $FileList) {
        ### Start a new Background Job for each file
        $JobList += Start-Job -ScriptBlock { Import-Csv -Path $args[0] | Where-Object -FilterScript { $PSItem.Status -eq 'Success'; } } -ArgumentList $File.FullName -Name $File.Name;
    }
    
    ### Wait for all the jobs to complete.
    Wait-Job -Job $JobList;
    
    ### Receive the results of the jobs.
    $ResultList = Receive-Job -Job $JobList;
    

    【讨论】:

      【解决方案3】:

      来自 Get-Help Import-CSV:

      -Path <String[]>
          Specifies the path to the CSV file to import. You can also pipe a path to Import-Csv.
      
          Required?                    false
          Position?                    1
          Default value                None
          Accept pipeline input?       true (ByValue)
          Accept wildcard characters?  false
      

      因此 Import-CSV 将接受来自管道的多个 -Path 值:

      $PCList = 
      Get-ChildItem '\\FILE05\Users\USER001\+Projects\Chrome\Services_Results*.csv' |
      Select -ExpandProperty FullName |
      Import-CSV |
      Where-Object {$_.Status -eq "Success"}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-13
        • 1970-01-01
        • 2016-12-03
        • 1970-01-01
        • 2017-09-16
        • 2018-02-10
        • 2021-03-11
        相关资源
        最近更新 更多