Powershell:逐行读取文本文件并在“|”上拆分
Powershell: Read Text file line by line and split on "|"
我在使用“|”将一行拆分为数组时遇到问题在文本文件中并按特定顺序重新组合。与文本文件中的原始行一样有多行。
这是原文:
80055555|Lastname|Firstname|AidYear|DCDOCS|D:\BDMS_UPLOAD0123456_11-13-2018 14-35-53 PM_1.pdf
我需要它看起来像这样:
80055555|DCDOCS|Lastname|Firstname|AidYear|D:\BDMS_UPLOAD0123456_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
}
您需要单独处理文件的每一行,然后拆分它们。
$File = get-content "D:\test34.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:\test21.txt" -Encoding "ascii" -append
编辑:感谢 LotPings 基于 -join
和避免 +=
构建数组的替代建议(这是低效的,因为它在每次迭代时重建数组):
$File = get-content "D:\test34.txt"
$OutputFile = foreach($line in $File){($line.split('|'))[0,4,1,2,3,5] -Join '|'}
$OutputFile | out-file -filepath "D:\test21.txt" -Encoding "ascii"
由于您的输入文件实际上是一个没有 headers 的 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
提供更符合 PowerShell 习惯的解决方案:
# Sample input line.
$line = '80055555|Lastname|Firstname|AidYear|DCDOCS|D:\BDMS_UPLOAD0123456_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 的索引语法(在 [...]
内)如何足够灵活以接受要提取的任意 array(列表)索引。
还要注意 -split
的 RHS 操作数是 \|
,即 escaped |
字符,假设 |
在那里有特殊含义(因为它被解释为 regex)。
综合起来:
$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
操作应用于输入 文件路径 ,而不是文件的 内容 .
其次,如上所述,要按 文字 |
字符拆分,必须将 \|
传递给 -split
,因为它需要一个 regex(正则表达式)。
此外,使用 Out-File
循环 和 -Append
相比,使用 单管道和ForEach-Object
,如上图
我在使用“|”将一行拆分为数组时遇到问题在文本文件中并按特定顺序重新组合。与文本文件中的原始行一样有多行。
这是原文:
80055555|Lastname|Firstname|AidYear|DCDOCS|D:\BDMS_UPLOAD0123456_11-13-2018 14-35-53 PM_1.pdf
我需要它看起来像这样:
80055555|DCDOCS|Lastname|Firstname|AidYear|D:\BDMS_UPLOAD0123456_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
}
您需要单独处理文件的每一行,然后拆分它们。
$File = get-content "D:\test34.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:\test21.txt" -Encoding "ascii" -append
编辑:感谢 LotPings 基于 -join
和避免 +=
构建数组的替代建议(这是低效的,因为它在每次迭代时重建数组):
$File = get-content "D:\test34.txt"
$OutputFile = foreach($line in $File){($line.split('|'))[0,4,1,2,3,5] -Join '|'}
$OutputFile | out-file -filepath "D:\test21.txt" -Encoding "ascii"
由于您的输入文件实际上是一个没有 headers 的 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
提供更符合 PowerShell 习惯的解决方案:
# Sample input line.
$line = '80055555|Lastname|Firstname|AidYear|DCDOCS|D:\BDMS_UPLOAD0123456_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 的索引语法(在 [...]
内)如何足够灵活以接受要提取的任意 array(列表)索引。
还要注意 -split
的 RHS 操作数是 \|
,即 escaped |
字符,假设 |
在那里有特殊含义(因为它被解释为 regex)。
综合起来:
$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
操作应用于输入 文件路径 ,而不是文件的 内容 .
其次,如上所述,要按 文字 |
字符拆分,必须将 \|
传递给 -split
,因为它需要一个 regex(正则表达式)。
此外,使用 Out-File
循环 和 -Append
相比,使用 单管道和ForEach-Object
,如上图