Измените файл с разделителями канала на разделенный запятыми в Powershell - PullRequest
2 голосов
/ 03 октября 2019

У меня есть файл .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 ]

2 голосов
/ 04 октября 2019

Единственная проблема с вашим ответом заключается в том, как вы пытаетесь заменить | символы на входе:

$s = $line -replace '|', ',' # WRONG

PowerShell's-replace оператор ожидает регулярное выражение (регулярное выражение) в качестве первого операнда RHS, а | является метасимволом регулярного выражения (имеет специальное значение) [1] ; использовать его как буквальный символ , вы должны \ -escape это:

# '\'-escape regex metacharacter '|' to treat it literally.
$s = $line -replace '\|', ','

В то время как PowerShell's -replace оператор очень гибкий, в простых случаях, таких как этот, вы можете альтернативно использовать .Replace() метод *1032* типа , который выполняет литерал строковых замен и, следовательно,не требует экранирования (это также быстрее, чем -replace):

# Use literal string replacement.
# Note: .Replace() is case-*sensitive*, unlike -replace
$s = $line.Replace('|', ',')

[1] | обозначает чередование в регулярном выражении, что означаетчто подвыражения с обеих сторон сопоставляются с входной строкой, и достаточно одного из них;если ваше полное регулярное выражение равно |, оно фактически соответствует пустой строке до и после каждого символа на входе, что объясняет ваш симптом;например, 'foo' -replace '|', '@' выход @f@o@o@

1 голос
/ 03 октября 2019

Вы можете использовать Import-Csv и Export-Csv, указав -Delimiter.

Import-Csv -Delimiter '|' -Path "c:\file.txt" | Export-Csv -Delimiter ',' -Path "c:\file.txt" -NoTypeInformation
0 голосов
/ 03 октября 2019

Вы найдете интересующие операторы -split и -join.

Get-Content -Path "C:\File.TXT" | ForEach-Object { ($_ -split "\|") -join "," } | Set-Content -Path "C:\Out.TXT"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...