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



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

$OutputFolder = "D:DC_CostingVendor DomainCostUpdate_Development_Load_To_IMS"
ForEach ($File in (Get-ChildItem "D:DC_CostingVendor DomainCostUpdate_Development_Stage_To_IMS*.txt")) 
{
(Get-Content $File) | Foreach-Object { $_.split()[0..9] -join '|' } | Out-File $OutputFolder$($File.Name)
}

然后我尝试的第二个代码在我的目标路径上创建新的文本文件,它确实摆脱了最后一列,但它失去了管道分隔符。嗯。

$OutputFolder = "D:DC_CostingVendor DomainCostUpdate_Development_Load_To_IMS"
ForEach ($File in (Get-ChildItem "D:DC_CostingVendor DomainCostUpdate_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)
}

我不知道我做错了什么。我没有偏好,但我需要保留分隔符,并删除最后一列。如有任何帮助,我将不胜感激。

Get-Content的纯文本处理尝试中,您只需要首先用|(.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一样双引号在结果CSV数据/文件中的每个字段。

在Windows PowerShell中,您无法避免此行为,但在PowerShell (Core) 7+中,您可以使用-UseQuotes Never来控制此行为,例如

你可以尝试一下,应该比使用Import-Csv更有效,但是注意,这应该总是排除你的文件的最后一列,无论他们有多少列假设它们是以管道分隔的:

$OutputFolder = "D:DC_CostingVendor DomainCostUpdate_Development_Load_To_IMS"
foreach ($File in (Get-ChildItem "D:DC_CostingVendor DomainCostUpdate_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)
}

相关内容

  • 没有找到相关文章