Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用powershell删除.csv文件中的最后一行_Powershell_Csv_Scripting - Fatal编程技术网

使用powershell删除.csv文件中的最后一行

使用powershell删除.csv文件中的最后一行,powershell,csv,scripting,Powershell,Csv,Scripting,我目前需要为我们的一个自动化脚本提供解决方案。作为过程的一部分,它从源抓取文件,并且必须删除.csv中的最后一行,并将其再次保存为csv文件(不确定为什么必须这样做,因为文件已经以.csv的形式出现,但没有它-它会出错)。问题是我似乎不知道如何删除最后一行。我提出的解决方案很少,但大多数只适用于.txt文件或对象。我现在得到的是: Import-Csv $file | where {$_.'Search Status' -ne "Blank line"} | Export-Csv "\file.

我目前需要为我们的一个自动化脚本提供解决方案。作为过程的一部分,它从源抓取文件,并且必须删除.csv中的最后一行,并将其再次保存为csv文件(不确定为什么必须这样做,因为文件已经以.csv的形式出现,但没有它-它会出错)。问题是我似乎不知道如何删除最后一行。我提出的解决方案很少,但大多数只适用于.txt文件或对象。我现在得到的是:

Import-Csv $file | where {$_.'Search Status' -ne "Blank line"} | Export-Csv "\file.csv" -notypeinfo

它确实删除了最后一行写有“空行”的内容,但它似乎只是删除了文本,当我的另一个脚本解析文件时,它无法正确地执行此操作。总而言之,我需要一个脚本,该脚本将获取此文件,完全删除最后一行,并将其再次保存为.csv,因为“导出csv”似乎不起作用。

您可以将文件加载到对象中,删除最后一行,然后重新写入:

$f = @(Get-Content -Path $file)
[array]::Reverse($f)
$f = $f | Select-Object -Skip 1
[array]::Reverse($f)
$f | Out-File -FilePath $file
注意:这对我来说是非常懒惰的(而且表现很差),因为我没有花更多的时间考虑它,但它完成了工作。

  • 导入csv
  • 获取项目计数
  • 选择第一行(计数-1)
  • 出口

或者


要通过执行
[array]:Reverse()
两次进行保存

取决于您的powershell版本,您只需使用Select Object的skiplast参数即可

Import-Csv $file | where {$_.'Search Status' -ne "Blank line"} | select -skiplast 1 | Export-Csv "\file.csv" -notypeinfo

在PSv5+中,您可以使用
选择对象的
-SkipLast
参数:

Get-Content $file | Select-Object -SkipLast 1 | Set-Content out.csv -Encoding UTF8
请注意,我只是使用
获取内容
而不是
导入Csv
,因为没有充分的理由产生
导入Csv
(为每个输入行构造自定义对象)和后续的
导出Csv
的开销(将每个自定义对象序列化为单个字符串中以逗号分隔的值列表)如果唯一需要的任务是作为一个整体删除一行

还请注意,我包含了一个
-Encoding
参数来说明您可能希望显式控制输出编码的观点,因为输入编码永远不会保留在PowerShell中。
设置内容
在Windows PowerShell上默认为“ANSI”编码,在PowerShell核心上默认为无BOM的UTF-8


PSv4-中,您可以使用以下技术来模拟
-SkipLast 1
;它也允许您在一次过程中完成同样的操作,而无需将整个输入文件加载到内存中:

Get-Content $file | ForEach-Object { $prev = $null } {      
  if ($null -ne $prev) { $prev }
  $prev = $_
} | Set-Content out.csv -Encoding UTF8

以上只是将管道输入对象的输出延迟一次迭代,这实际上忽略了最后一个输入对象。

Huh.
-SkipLast
没有文档(即使参数名称很明显)。@TheIncorrigible1:好的一点:没有描述它,但列出了它(作为v6文档中语法图的一部分;在v5.1和v5.0文档中,它的正文中也有一个参数详细信息段落,但仍然缺少描述);请参见@TheIncorrigible1,我为此做了PR,现在
-SkipLast
描述处于活动状态(仍有待于v5合并)。仅供参考
Get-Content $file | Select-Object -SkipLast 1 | Set-Content out.csv -Encoding UTF8
Get-Content $file | ForEach-Object { $prev = $null } {      
  if ($null -ne $prev) { $prev }
  $prev = $_
} | Set-Content out.csv -Encoding UTF8