簡體   English   中英

使用Powershell從一個文件夾中的多個CSV文件中刪除前15行

[英]Delete first 15 lines from multiple CSV files in one folder using Powershell

我有一個Powershell腳本,可以從單個CSV文件中刪除前15行。

$import = get-content c:\temp\test.csv
$import | Select-Object -Skip 15 | Set-Content c:\temp\test2.csv

我想在單個文件夾中的多個CSV文件中循環播放。 不太清楚如何做到這一點。

可選的-NumberOfLines參數,默認為15

可選-Verbose參數將輸出修改后的文件。

function Remove-CSVLines {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$FolderPath,

        [int]$NumberOfLines = 15
    )
    process{
        $fileList = (Get-ChildItem -Path $FolderPath -Filter '*.csv')

        foreach ($file in $fileList){
            $csvObject = Import-Csv -Path $file.PSPath
            $csvObject | Select-Object -Property * -Skip $NumberOfLines | Export-CSV -Path $file.PSPath -Force -NoTypeInformation
            Write-Verbose -Message "Removed $NumberOfLines lines from $file"
        }
    }
}

Remove-CSVLines -FolderPath .\myfolder

這是一個單管道解決方案 ,該文件將文件處理為文本文件,並跳過前15個數據 ,即保留標題行(CSV文件的第一行,其中包含列名),並為每個*.csv保存結果*.csv文件到相應的*2.csv文件

Get-ChildItem c:\temp -Filter *.csv | ForEach-Object {
  Get-Content $_.FullName | 
    Where-Object { $_.ReadCount -eq 1 -or $_.ReadCount -ge 17 } |  
      Set-Content ($_.FullName -replace '\.csv$', '2$&')
}

注意:要無條件刪除前15 ,請將Where-Object命令替換為:
Select-Object -Skip 15

請注意.ReadCount屬性的使用,該屬性包含輸入行號。 Get-Content將此屬性添加到它從輸入文件讀取的每一行。

將CSV文件處理為文本文件 (使用Get-Content / Set-Content而不是Import-Csv / Export-Csv )可以加快處理速度 (並保留值周圍是否存在雙引號),但是請注意,假設文本行CSV行相同 :CSV 通常與文本文件行相同 ,但不一定正確:CSV列值(如果用"..."括起來)可能跨越多條線

另請注意,在Windows PowerShell中, 無論輸入編碼如何,默認情況下, Set-Content都會創建“ ANSI”編碼的輸出文件。 在PowerShell Core中 ,最終將得到無BOM的UTF-8編碼文件。 使用-Encoding來控制輸出編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM