如何在PowerShell中删除第一行和最后一行

4

这个脚本将对csv文件进行一些处理,特别是删除第一行(参考如何使用Powershell导出“非标准”CSV):

Import-Csv in.csv -header Date,Time,O,H,L,C,V|select * -ExcludeProperty time|
%{$_.date = [datetime]::ParseExact($_.date,"yyyy.MM.dd",$null).tostring("yyMMdd");$_.v=1;$_}|
ConvertTo-Csv -NoTypeInformation|
select -skip 1|
%{$_ -replace '"'}|
Set-Content out.csv -encoding ascii

现在我需要对其进行改进,同时也要删除最后一行。我尝试添加以下内容:

select -skip ($_.Count - 1)

但是它会生成异常。

那么正确的语法是什么?

2个回答

9

根据您拥有的PowerShell版本,您可以使用-SkipLast参数,例如:

... | Select -Skip 1 | Select -SkipLast 1

SkipLast 可用于 PowerShell 5.0 及更高版本。

如果您没有该参数,可以通过微软网站安装。Windows 7 是最早可以运行 PowerShell 5 的操作系统版本。

如果不可能,可以使用:

$csv = Import-Csv in.csv -header Date,Time,O,H,L,C,V | `
       Select * -ExcludeProperty time | `
       Foreach {$_.date = [datetime]::ParseExact($_.date,"yyyy.MM.dd",$null).tostring("yyMMdd");$_.v=1;$_} | `
       ConvertTo-Csv -NoTypeInformation

for ($i = 1; $i -lt ($csv.Length - 1); $i++) { 
    $csv[$i] -replace '"' | Add-Content out.csv -encoding ascii
}

1
如果您因为没有 Powershell 5 而无法运行 -SkipLast,那么我建议使用以下代码而不是使用 for 循环:
$csv[1..$($csv.Count - 2)]

这样做,您将跳过第一行和最后一行。然后,您必须对$csv变量进行一些检查(长度等),添加您的设置内容代码,它应该可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接