【问题标题】:Replacing quotes around fields generated by the ConvertTo-Csv cmdlet替换 ConvertTo-Csv cmdlet 生成的字段周围的引号
【发布时间】:2016-03-13 05:12:13
【问题描述】:

我有一个使用ConvertTo-Csv cmdlet 导出的制表符分隔的csv 文件。导出时,它将每个字段括在引号中。我正在尝试仅删除这些引号(我不想删除字段中的引号)。这个我试过了,还是不行。

(Get-Content $root\$filename) | % {$_ -replace('"`t"', "`t")} | Set-Content $root\$filename

值以制表符分隔的“MASSP”形式打印。如果是“M”ASSP,我想去掉外面的双引号,把那个放在字母“M”后面。

【问题讨论】:

  • 怎么没用?它只是错过了第一个引号,传递了一个错误,还是没有替换任何一个?
  • 该文件是在字段和字段名称周围的引号中生成的。
  • 我想你的意思是"M""ASSP",而不是"M"ASSP"ConvertTo-Csv嵌入的 双引号转义为 ""
  • 我只是指转换为 csv 产生的任何双引号

标签: csv powershell replace field


【解决方案1】:

尝试以下方法:

(Get-Content $root\$filename) |
  % { ($_ -replace '^"|"$|(?<=\t)"|"(?=\t)', '') -replace '""', '"' } |
    Set-Content $root\$filename

- 虽然问题中的-replace('"`t"', "`t") 恰好在语法上起作用,但这表明您错误地认为-replace 需要方法语法 才能调用;但是,-replace运算符
- 在正则表达式参数中,由于您使用的是单引号字符串,正则表达式转义规则适用,因此选项卡必须表示为\t
- 与我最初的想法不同, 可以在单个管道中读取和写入同一个文件,正如 OP 本人所证明的以及 Frode F. 在评论中指出的那样:封闭括号中的Get-Content $root\$filename 确保文件被作为一个整体预先读取并立即关闭,从而允许Set-Content 覆盖它。

该方法使用 2 遍:

  • 在第一遍中,所有字段-开始和字段-结束双引号都被删除。
    • ^" 匹配第一个字段的开头 "
    • (?&lt;=\t)" 匹配除第一个字段之外的任何字段的开头 "
    • "(?=\t) 匹配除最后一个字段之外的任何字段的结束引号。
    • "$ 匹配最后一个字段的结束 "
  • 在第二遍中,所有字段-内部双引号-被ConvertTo-Csv加倍-被替换为单个实例。

【讨论】:

  • 谢谢 mklement0 您的解决方案有效!我在这里从你们那里学到了很多东西。
  • (Get-Content file.txt) | % { $_ } | Set-Content file.txt 有效。在Get-Content 周围使用子/组表达式,这样它将在将整个文件发送到管道之前读取整个文件。
  • @FrodeF.:谢谢,我错过了 - 这是一个方便的技巧(虽然不适合大文件);答案已更新。
  • Get-content 老实说不适合大文件。 :-)
猜你喜欢
  • 1970-01-01
  • 2014-05-30
  • 2014-07-27
  • 2022-11-05
  • 1970-01-01
  • 2019-11-01
  • 2020-05-16
  • 2020-05-21
相关资源
最近更新 更多