Powershell: чтение текстового файла построчно и разделение на «|» - PullRequest
0 голосов
/ 13 декабря 2018

У меня проблемы с разбиением строки на массив с использованием "|"в текстовом файле и повторной сборки в определенном порядке.Есть несколько строк, таких как исходная строка в текстовом файле.

Это оригинальная строка:

80055555|Lastname|Firstname|AidYear|DCDOCS|D:\BDMS_UPLOAD\800123456_11-13-2018 14-35-53 PM_1.pdf

Мне нужно, чтобы это выглядело так:

80055555|DCDOCS|Lastname|Firstname|AidYear|D:\BDMS_UPLOAD\800123456_11-13-2018 14-35-53 PM_1.pdf

Вот код, с которым я работаю:

$File = 'c:\Names\Complete\complete.txt'
$Arr = $File -split '|'
foreach ($line in Get-Content $File)
{
  $outputline = $Arr[0] + "|" + $Arr[4] + "|" + $Arr[1] + "|" + $Arr[2] + "|" + 
    "@@" + $Arr[5] |
      Out-File -filepath "C:\Names\Complete\index.txt" -Encoding "ascii" -append 
}

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Поскольку ваш входной файл на самом деле является CSV-файлом без заголовков, а поля разделены символом канала |, почему бы не использовать Import-Csv, например:

$fileIn  = 'C:\Names\Complete\complete.txt'
$fileOut = 'C:\Names\Complete\index.txt'
(Import-Csv -Path $File -Delimiter '|' -Header 'Item','LastName','FirstName','AidYear','Type','FileName' | 
    ForEach-Object {
        "{0}|{1}|{2}|{3}|{4}|{5}" -f $_.Item, $_.Type, $_.LastName, $_.FirstName, $_.AidYear, $_.FileName
    }
) | Add-Content -Path $fileOut -Encoding Ascii
0 голосов
/ 14 декабря 2018

Чтобы предложить более PowerShell-идиоматическое решение:

# Sample input line.
$line = '80055555|Lastname|Firstname|AidYear|DCDOCS|D:\BDMS_UPLOAD\800123456_11-13-2018 14-35-53 PM_1.pdf'

# Split by '|', rearrange, then re-join with '|'
($line -split '\|')[0,4,1,2,3,5] -join '|'

Обратите внимание, что синтаксис индексации PowerShell (внутри [...]) достаточно гибок, чтобы принять произвольный массив (список) из

Также обратите внимание, что операнд RHS -split равен \|, т. е. экранированный | char., учитывая, что | имеет там особое значение(потому что это интерпретируется как регулярное выражение ).

Чтобы сложить все вместе:

$File = 'c:\Names\Complete\complete.txt'
Get-Content $File | ForEach-Object {
  ($_ -split '\|')[0,4,1,2,3,5] -join '|'
} | Out-File -LiteralPath C:\Names\Complete\index.txt -Encoding ascii

Что касается то, что вы пытались :

$Arr = $File -split '|'

Прежде всего проблема заключается в том, что операция -split применяется к входному пути к файлу , а не к содержимое файла .

Во-вторых, как отмечено выше, для разделения на литерал | char., \| должно быть передано -split,поскольку он ожидает регулярное выражение (регулярное выражение).

Кроме того, вместо использования Out-File внутри цикла с -Append, более эффективно использовать один пиpeline с ForEach-Object, как показано выше.

0 голосов
/ 13 декабря 2018

Вам необходимо обработать каждую строку файла самостоятельно, а затем разделить их.

$File = get-content "D:\test\1234.txt"
foreach ($line in $File){
    $Arr = $line.Split('|')
    [array]$OutputFile +=  $Arr[0] + "|" + $Arr[4] + "|" + $Arr[1] + "|" + $Arr[2] + "|" + "@@" + $Arr[5] 
}
$OutputFile | out-file -filepath "D:\test\4321.txt" -Encoding "ascii" -append 

edit: Thx to LotPings для этого альтернативного предложения, основанного на -join и избежании+= для построения массива (что неэффективно, потому что он перестраивает массив на каждой итерации):

$File = get-content "D:\test\1234.txt"
$OutputFile = foreach($line in $File){($line.split('|'))[0,4,1,2,3,5] -Join '|'}
$OutputFile | out-file -filepath "D:\test\4321.txt" -Encoding "ascii"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...