【问题标题】:Add quotes to each column in a CSV via Powershell通过 Powershell 为 CSV 中的每一列添加引号
【发布时间】:2015-05-21 08:53:24
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 根据我使用 PowerShell 4 的经验,当您通过 Import-CSV 传递文件然后使用 Export-CSV 将其导出回来时,它总是为每个字段添加双引号字段标识符。这可能很愚蠢,但在您初始导出后,运行 Import-Csv $file | Export-Csv $file -NoTypeInformation -Force 可能会自动为您解决引用问题。
  • 这仍然只在带有空格或其他特殊字符的值周围留下引号。看起来我只能访问 Powershell V1,这可能是问题的一部分。

标签: powershell csv export-to-csv


【解决方案1】:

您也可以使用以下代码:

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

【讨论】:

    【解决方案2】:

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

    假设您正在导出整个对象$r

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

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

    澄清正则表达式的作用:

    匹配:,(.*?),

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

    替换:,"$1",

    解释:$1 保存匹配中上面提到的两个括号之间的匹配。我用引号包围它并重新添加逗号,因为我也匹配了它们,它们必须被替换或者它们被简单地消耗掉。请注意,虽然-replace 的匹配部分可以使用双引号而不会出现问题,但替换部分必须用单引号括起来,否则 PowerShell 会将$1 解释为 PowerShell 变量而不是匹配变量。

    【讨论】:

    • 文本中有逗号怎么办?这如何处理第一列和最后一列?
    • 很明显,逗号可以存在于 CSV 中的唯一方法是,如果包含逗号的字符串已经包含在引号中。因此,您可以将匹配表达式更改为仅匹配没有引号的字段。像这样的东西:',^"(.*?)^",'。至于第一列和最后一列,您可以编写一个超级复杂的正则表达式来处理它,或者只是将第一个替换的结果发送到另一个专门处理第一列和最后一列的替换。
    • 注意,我最初编写这段代码是为了在需要引号时删除引号,这当然是一个更简单的正则表达式。我试图说明的一点是,您没有必须使用Export-Csv,而只是接受它的做事方式。您可以使用ConvertTo-Csv,然后使用正则表达式将其修改为您心中的内容。
    • ConvertTo-Csv 未出现在我有权访问的 Powershell 版本 (v1) 中。我的原始文件确实在正确的位置有引号,但脚本的最初目的是转换它所做的日期戳,但在导出时我丢失了引号。
    • 我已经修改了您的正则表达式以允许已引用的值,因此它不会双引号。 | % { $_ -replace ',\"?(.+?)\"?,', ',"$1",' }
    【解决方案3】:

    我通过以下方式重新解析文件来欺骗我想要的东西 - 猜测它充当文件的简单查找和替换。

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

    感谢您对此的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-22
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2011-10-08
      相关资源
      最近更新 更多