在Powershell中将管道定界文件更改为逗号定界

时间:2019-10-03 19:55:53

标签: powershell

我有一个以竖线分隔的.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

3 个答案:

答案 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)

您会发现-split-join运算符很有趣。

Get-Content -Path "C:\File.TXT" | ForEach-Object { ($_ -split "\|") -join "," } | Set-Content -Path "C:\Out.TXT"