使用Powershell从一个文件夹中的多个CSV文件中删除前15行

时间:2019-01-31 23:16:59

标签: powershell csv

我有一个Powershell脚本,可以从单个CSV文件中删除前15行。

void

我想在单个文件夹中的多个CSV文件中循环播放。不太清楚如何做到这一点。

2 个答案:

答案 0 :(得分:0)

可选的-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

答案 1 :(得分:0)

这是一个单管道解决方案,该文件将文件作为 text 文件处理,并跳过前15个 >,即保留标题行(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文件作为 text 文件处理(使用Get-Content / Set-Content而不是Import-Csv / {{1 }})可以更快地处理(并保留值周围是否存在双引号),但是有一个 caveat重新假定文本行 CSV行 相同:而CSV row 通常 与文本文件 line 相同,不一定 正确:CSV列值(如果用Export-Csv括起来,可能会跨多行

还请注意,在Windows PowerShell "..."中,默认情况下将创建“ ANSI”编码的输出文件,与输入编码无关;在PowerShell Core 中,您最终会得到无BOM的UTF-8编码文件。 使用Set-Content来控制输出编码。