我们如何使用powershell脚本在CSV文件的顶部添加新行?

时间:2019-10-05 15:19:52

标签: powershell

我是PowerShell脚本的新手,我正在寻找一种在现有的csv文件顶部添加2个新行的方法。 我尝试过的事情是用新行替换标题和行。 我正在寻找一种在CSV标题上方添加2行的方法。

1 个答案:

答案 0 :(得分:1)

您提到要在标题的上方处添加新行,这意味着不需要CSV特定的处理-听起来您在询问如何行添加到现有的文本文件 (恰好包含CSV-请注意,生成的文件将不再是有效的CSV文件

例如,假设目标文件名为some.csv

注意:最好在尝试这些命令之前对目标文件进行备份


如果输入文件足够小以适合整个内存

使用Get-Content -Raw作为单个字符串将整个目标文件读入内存,可以提供一种方便而简洁的解决方案:

Set-Content -LiteralPath some.csv -NoNewLine -Value (
  @'
New line 1 above header
New line 2 above header

'@ + (Get-Content -Raw some.csv)
)

请注意,Set-Content会应用默认字符编码( Windows PowerShell 中的活动ANSI代码页,PowerShell Core 中没有BOM的UTF-8) some.csv的当前编码,因此您可能必须使用-Encoding参数来明确指定编码。

还要注意,单引号这里的字符串(@'<newline>...<newline>'@)使用与封闭脚本相同的换行符样式(CRLF(Windows样式)与LF(Unix样式)),可能不匹配some.csv中使用的样式-尽管PowerShell本身在处理带有混合换行样式的文件时没有问题。


如果文件太大而无法容纳到内存中,请使用流式传输(逐行)方法:

$ErrorActionPreference = 'Stop'

# Create a temporary file and fill it with the 2 new lines.
$tempFile = [IO.Path]::GetTempFileName()
'New line 1 above header', 'New line 2 above header' | Set-Content $tempFile

# Then append the CSV file's lines one by one.
Get-Content some.csv | Add-Content $tempFile

# If that succeeded, replace the original file.
Move-Item -Force $tempFile some.csv

注意:使用Get-ContentSet-ContentAdd-Content cmdlet 方便,但是很慢;下一节显示了一个更快的选择。


如果性能很重要,请改用[IO.File]之类的.NET类型:

$ErrorActionPreference = 'Stop'

# Create a temporary file...
$tempFile = [IO.Path]::GetTempFileName()

# ... and fill it with the 2 new lines.
$streamWriter = [IO.File]::CreateText($tempFile)
foreach ($lineToPrepend in 'New line 1 above header', 'New line 2 above header') {
  $streamWriter.WriteLine($lineToPrepend)
}

# Then append the CSV file's lines one by one.
foreach ($csvLine in [IO.File]::ReadLines((Convert-Path some.csv))) {
  $streamWriter.WriteLine($csvLine)
}

$streamWriter.Dispose()

# If that succeeded, replace the original file.
Move-Item -Force $tempFile some.csv