替换ConvertTo-Csv cmdlet生成的字段周围的引号

时间:2016-03-13 05:12:13

标签: csv powershell replace field

我有一个使用ConvertTo-Csv cmdlet导出的制表符分隔的csv文件。导出时,它将每个字段用引号括起来。我试图删除这些引号(我不想删除字段中的那些)。我试过这个并没有用。

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

值打印如下" MASSP"由制表符分隔。如果它是" M" ASSP"我想删除外面的双引号并在字母后面保存一个" M"。

1 个答案:

答案 0 :(得分:4)

尝试以下方法:

(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括在括号中可确保将文件作为整体预先立即关闭进行读取,从而允许{{1覆盖它。 功能

该方法使用2次传递:

  • 在第一遍中,将删除所有field- 开始和field- 结尾双引号。
    • Set-Content与第一个字段^"
    • 相匹配
    • "匹配任何字段的开头(?<=\t)",但是匹配第一个字段。
    • "匹配任何字段的结束引用,但最后一个。
    • "(?=\t)匹配最后一个字段"$
  • 在第二次传递中,所有field- 内部双引号 - 由" 加倍 - 将被单个实例替换。