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

Replacing quotes around fields generated by the ConvertTo-Csv cmdlet

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

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

值是这样打印的 "MASSP" 由制表符分隔。如果是 "M"ASSP" 我想去掉外面的双引号并保存字母 "M".

后面的双引号

尝试以下操作:

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

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

该方法使用 2 遍:

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