我有一个管道分隔的文本文件文件夹,我需要删除最后一列。我在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)
}