我有一个Powershell脚本,可以从单个CSV文件中删除前15行。
void
我想在单个文件夹中的多个CSV文件中循环播放。不太清楚如何做到这一点。
答案 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
来控制输出编码。