Powershell:在 CSV 文件的多列中添加新行

问题描述

我在 csv 文件中有数据,如下所示:

标题 1 标题 2 标题 N
12 34 Val M
99 42 Val Z

到目前为止,这允许我在它上面添加

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

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

所以上面的第 1 行和第 2 行都在第一列 “标题上方的新行 1” 和 “标题上方的新行 1” 其余数据保持原样(这是我想要的)。 我需要知道的是如何像我一直在做的那样添加一个新行,但我也希望能够添加到它旁边的其他列中。

所以假设第一个单元格中的第一行如上所示。 但现在在第一行的第二列,我想添加文字“任何东西都可以放在这里”。

理想输出

标题
公司 1 地址 公司二地址
公司 1 邮编 公司 2 邮编
--------------------- ------------------- -------------------
标题 1 标题 2 标题 N
--------------------- ------------------- -------------------
12 34 Val M
99 42 Val Z

编辑 1:我不知道为什么会出现额外的破折号,但我不想要

Set-Content -LiteralPath sample.csv -NoNewLine -Value (
  @'
Title
From/De:,To/A:
Name1,Name2
Add1,Add2
Zip1,Zip2
'@ + (Get-Content -Raw sample.csv)
)

如果任何姓名或地址中包含逗号,将它们放在双引号内将转义它们。

解决方法

与其尝试操作原始 csv 文件,您还可以从 csv 导入数据,对其进行修改,然后再将其导出回 csv。

这样的事情可能会奏效:

$csv = @"
Heading 1,Heading 2,Heading N
12,34,Val M
99,42,Val Z
"@;

# use Import-Csv to read from a csv file instead
$data = @( $csv | ConvertFrom-Csv );

# output the original data so we can see what it looks like
$data
#Heading 1 Heading 2 Heading N
#--------- --------- ---------
#12        34        Val M
#99        42        Val Z

# create the new rows
$newRows = @(
    (new-object PSCustomObject -Property ([ordered] @{
        "Heading 1" = "first new row column 1"
        "Heading 2" = "first new row column 2"
        "Heading N" = "first new row column N"
    })),(new-object PSCustomObject -Property ([ordered] @{
        "Heading 1" = "second new row column 1"
        "Heading 2" = "second new row column 2"
        "Heading N" = "second new row column N"
    }))
);

# add the new rows to the start of the data
$data = $newRows + $data;

# output the updated data we can see what it looks like now
$data
#Heading 2               Heading 1               Heading N
#---------               ---------               ---------
#first new row column 2  first new row column 1  first new row column N
#second new row column 2 second new row column 1 second new row column N
#34                      12                      Val M
#42                      99                      Val Z

# export the new data back to the csv file
$data | Export-Csv -Path "some.csv" -NoTypeInformation;

注意 - 尝试操作原始 csv 文本的问题是,如果您的数据包含 ", 等语法字符或换行符,您可能无法正确转义它们,并且可能会损坏您的 csv 文件。