替换由 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 front 和 closed立即,允许Set-Content
覆盖它。
该方法使用 2 遍:
- 在第一遍中,所有 field-starting 和 field-ending 双引号被删除。
^"
匹配第一个字段的开头 "
(?<=\t)"
匹配除第一个以外的任何字段的开头 "
。
"(?=\t)
匹配除最后一个字段之外的任何字段的结束引号。
"$
匹配最后一个字段的结束 "
.
- 在第二遍中,所有字段-内部双引号——被
ConvertTo-Csv
加倍——替换为单个实例。
我有一个使用 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 front 和 closed立即,允许Set-Content
覆盖它。
该方法使用 2 遍:
- 在第一遍中,所有 field-starting 和 field-ending 双引号被删除。
^"
匹配第一个字段的开头"
(?<=\t)"
匹配除第一个以外的任何字段的开头"
。"(?=\t)
匹配除最后一个字段之外的任何字段的结束引号。"$
匹配最后一个字段的结束"
.
- 在第二遍中,所有字段-内部双引号——被
ConvertTo-Csv
加倍——替换为单个实例。