PowerShell 删除管道分隔文本文件的最后一列

PowerShell remove last column of pipe delimited text file

我有一个管道分隔文本文件的文件夹,我需要删除其中的最后一列。我在 PS 方面经验不足,但我通过搜索找到了足够的帮助。我有两段代码。第一个在我的目标路径中创建新的文本文件,保留竖线分隔符,但不删除最后一列。有 11 列。这是该脚本:

$OutputFolder = "D:\DC_Costing\Vendor Domain\CostUpdate_Development_Load_To_IMS"

ForEach ($File in (Get-ChildItem "D:\DC_Costing\Vendor Domain\CostUpdate_Development_Stage_To_IMS\*.txt")) 
{
(Get-Content $File) | Foreach-Object { $_.split()[0..9] -join '|' } | Out-File $OutputFolder$($File.Name)
}

然后我尝试的第二个代码在我的目标路径上创建了新的文本文件,它确实去掉了最后一列,但它丢失了竖线分隔符。呃.

$OutputFolder = "D:\DC_Costing\Vendor Domain\CostUpdate_Development_Load_To_IMS"

ForEach ($File in (Get-ChildItem "D:\DC_Costing\Vendor Domain\CostUpdate_Development_Stage_To_IMS\*.txt")) 
{
Import-Csv $File -Header col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11 -Delimiter '|' | 
Foreach-Object {"{0} {1} {2} {3} {4} {5} {6} {7} {8} {9}" -f $_.col1,$_.col2,$_.col3,$_.col4,$_.col5,$_.col6,$_.col7,$_.col8,$_.col9,$_.col10} | Out-File $destination$($File.Name)
}

我不知道自己做错了什么。我没有偏好以哪种方式完成此操作,但我需要保留分隔符并删除最后一列。任何帮助将不胜感激。

您可以尝试一下,应该比使用 Import-Csv 更有效,但是请注意,这应该始终排除文件的 最后一列,无论它们有多少列 并假设它们是 竖线分隔的:

$OutputFolder = "D:\DC_Costing\Vendor Domain\CostUpdate_Development_Load_To_IMS"

foreach ($File in (Get-ChildItem "D:\DC_Costing\Vendor Domain\CostUpdate_Development_Stage_To_IMS\*.txt")) {
    [IO.File]::ReadAllLines($File.FullName) | & {
        process{
            -join ($_ -split '(?=\|)' | Select-Object -SkipLast 1)
        }
    } | Set-Content (Join-Path $OutputFolder -ChildPath $File.Name)
}

在使用 Get-Content 的 plain-text 处理尝试中,您只需先将每一行拆分为 | (.Split('|')),然后再使用范围操作 (..) 并用 |:

加入它们
Get-Content $File | 
  Foreach-Object { $_.Split('|')[0..9] -join '|' } |
    Out-File $OutputFolder$($File.Name)

在基于 Import-Csv 的尝试中,您可以利用这样一个事实,即它只会读取与您提供的列名一样多的列,通过 -Header:

# Pass only 10 column names to -Header
Import-Csv $File -Header (0..9).ForEach({ 'col' + $_ }) -Delimiter '|' | 
  ConvertTo-Csv -Delimiter '|' | # convert back to CSV with delimiter '|'
    Select-Object -Skip 1 |  # skip the header row
      Out-File $destination$($File.Name)

请注意 ConvertTo-Csv,就像 Export-Csv 默认情况下 double-quotes 结果 CSV 数据/文件中的每个字段。

在 Windows PowerShell 中,您无法避免这种情况,但在 PowerShell (Core) 7+ 中,您可以使用 -UseQuotes Never 来控制这种行为。