我有一个以竖线分隔的.TXT文件。我需要将定界符改为逗号,但仍将文件扩展名保持为.TXT。该文件如下所示:
第1列|第2列
13 | 2019-09-30
96 | 2019-09-26
173 | 2019-09-25
我的脚本使用Windows Powershell 5.1版本。
我正在使用以下代码:
$file = New-Object System.IO.StreamReader -Arg "c:\file.txt"
$outstream = [System.IO.StreamWriter] "c:\out.txt"
while ($line = $file.ReadLine()) {
$s = $line -replace '|', ','
$outstream.WriteLine($s)
}
$file.close()
$outstream.close()
输出文件看起来像这样,而不是用逗号替换管道:
C,o,l,u,m,n,1,|,C,o,l,u,m,n,2
1,3,|,2,0,1,9,-,0,9,-,3,0
9,6,| 2,0,1,9,-,0,9,-,2,6
1,7,3,|,2,0,1,9,-,0,9,-,2,5
答案 0 :(得分:2)
答案的唯一问题是如何尝试替换输入中的API Console
字符:
|
PowerShell的$s = $line -replace '|', ',' # WRONG
运算符期望 regex (正则表达式)作为其第一个RHS操作数,并且-replace
是一个regex元字符(具有特殊的意思) [1] ;要将其用作文字字符,您必须必须|
转义:
\
虽然PowerShell's -replace
operator非常灵活,但在这种简单情况下,您也可以使用# '\'-escape regex metacharacter '|' to treat it literally.
$s = $line -replace '\|', ','
类型的[string]
方法,该方法执行文字字符串替换,因此不需要转义(它也比.Replace()
更快):
-replace
[1] # Use literal string replacement.
# Note: .Replace() is case-*sensitive*, unlike -replace
$s = $line.Replace('|', ',')
在正则表达式中表示 alternation ,这意味着任一侧的子表达式都与输入字符串匹配,并且其中一个匹配就足够了;如果您的完整正则表达式仅为|
,则它可以有效地匹配输入中每个字符前后的空字符串,这可以解释您的症状;例如,|
产生'foo' -replace '|', '@'
答案 1 :(得分:1)
您可以通过指定Import-Csv
来使用Export-Csv
和-Delimiter
。
Import-Csv -Delimiter '|' -Path "c:\file.txt" | Export-Csv -Delimiter ',' -Path "c:\file.txt" -NoTypeInformation
答案 2 :(得分:0)