我是PowerShell脚本的新手,我正在寻找一种在现有的csv文件顶部添加2个新行的方法。 我尝试过的事情是用新行替换标题和行。 我正在寻找一种在CSV标题上方添加2行的方法。
答案 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-Content
,Set-Content
和Add-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