通过 Powershell 为 CSV 中的每一列添加引号

Add quotes to each column in a CSV via Powershell

我正在尝试创建一个 Powershell 脚本,该脚本在导出为 CSV 文件时将引号括在文件的每一列周围。然而,Export-CSV 小程序只将它们放在需要的地方,即文本中有 space 或类似内容的地方。 我尝试使用以下内容在每行中包含引号,但最终在每列中包含三个引号。

$r.SURNAME =  '"'+$r.SURNAME+'"';

是否有人能够分享如何在文件的每一列上强制执行这些操作 - 到目前为止,我只能找到有关剥离这些操作的信息。

谢谢

您还可以使用以下代码:

$r.SURNAME = "`"$($r.SURNAME)`""

也许更好的方法是简单地转换为 CSV(不导出),然后一个简单的正则表达式可以添加引号,然后通过管道将其输出到文件。

假设您要导出整个 object $r:

$r | ConvertTo-Csv -NoTypeInformation `
   | % { $_ -replace ',(.*?),',',"",' } `
   | Select -Skip 1 | Set-Content C:\temp\file.csv

Select -Skip 1 删除 header。如果你想要 header 就把它拿出来。

阐明正则表达式的作用:

匹配:,(.*?),

说明:这将匹配每行中有一个逗号后跟任意数量的字符(.*)的部分而不是贪婪的(?:基本上意味着它只会匹配最小数量完成匹配所需的字符数),finally 以逗号结尾。括号将把两个逗号之间的所有内容保存在匹配变量中,稍后在替换中使用。

替换:,"",

说明:</code>保存了匹配中上面提到的两个括号之间的匹配。我在它周围加上引号和 re-adding 逗号,因为我也匹配它们,它们必须被替换或者它们被简单地消耗掉。请注意,虽然 <code>-replace 的匹配部分可以使用双引号而不会出现问题,但替换部分必须用单引号引起来,否则 会被 PowerShell 解释为 PowerShell 变量,而不是匹配变量。

我通过以下方法重新解析文件来作弊以获取我想要的内容 - 猜测它充当了对文件的简单查找和替换。

get-content C:\Data\Downloads\file2.csv 
| foreach-object { $_ -replace '"""' ,'"'} 
| set-content C:\Data\Downloads\file3.csv

感谢您对此的帮助。