【问题标题】:Merges csv files from directory into a single csv file PowerShell将目录中的 csv 文件合并到单个 csv 文件 PowerShell
【发布时间】:2018-09-15 19:54:32
【问题描述】:

如何运行一个 PowerShell 脚本来连续执行以下操作?

  1. 使用此脚本将目录中所有 csv 文件的文件名作为列添加到每个文件的末尾:

    Get-ChildItem *.csv | ForEach-Object {
    $CSV = Import-CSV -Path $_.FullName -Delimiter ","
    $FileName = $_.Name
    
    $CSV | Select-Object *,@{N='Filename';E={$FileName}} | Export-CSV $_.FullName -NTI -Delimiter ","}
    
  2. 将目录下的所有csv文件合并成一个单独的csv文件

  3. 仅保留第一个 csv 的标题(第一行),并排除文件中的所有其他第一行。

    类似于 kemiller2002 所做的 here,除了一个带有 csv 输入和一个 csv 输出的脚本。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    这是一般模式:

    Get-ChildItem \inputCSVFiles\*.csv |
      ForEach-Object { Import-Csv $_ } |
      Export-Csv \outputCSVFiles\newOutputFile.csv -NoTypeInformation
    

    确保输出 CSV 文件具有不同的文件名模式,或使用不同的目录名称(如本例所示)。

    【讨论】:

      【解决方案2】:

      Bill 的回答允许您组合 CSV,但不会将文件名添加到每行的末尾。我认为最好的方法是使用PipelineVariable 通用参数将其添加到ForEach 循环中。

      Get-ChildItem \inputCSVFiles\*.csv -PipelineVariable File |
        ForEach-Object { Import-Csv $_ | Select *,@{l='FileName';e={$File.Name}}} |
        Export-Csv \outputCSVFiles\newOutputFile.csv -NoTypeInformation
      

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

      【讨论】:

        【解决方案3】:

        如果您的 csv 文件没有始终相同的标题,您可以这样做:

        $Dir="c:\temp\"
        
        #get header first csv file founded
        $header=Get-ChildItem $Dir -file -Filter "*.csv" | select -First 1 | Get-Content -head 1
        
        #header + all rows without header into new file
        $header, (Get-ChildItem $Dir -file -Filter "*.csv" | %{Get-Content $_.fullname | select -skip 1}) | Out-File "c:\temp\result.csv"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-07
          • 2019-10-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多