PowerShell:slice and dice制表符分隔的文件

PowerShell:slice and dice制表符分隔的文件,powershell,text,tabs,import-csv,Powershell,Text,Tabs,Import Csv,我有一个由备份软件生成的以制表符分隔的文本文件。我希望能够使用导入CSV将其导入为PowerShell阵列 问题是导出文件的前5行阻止PowerShell将其识别为数组: #List of Media #Cell Manager: hpdp.domain.local #Creation Date: 11/08/2018 9:36:09 AM # Headers # Medium ID Label Location Status Protection Used [MB] Tota

我有一个由备份软件生成的以制表符分隔的文本文件。我希望能够使用导入CSV将其导入为PowerShell阵列

问题是导出文件的前5行阻止PowerShell将其识别为数组:

#List of Media
#Cell Manager: hpdp.domain.local
#Creation Date: 11/08/2018 9:36:09 AM
# Headers
# Medium ID Label   Location    Status  Protection  Used [MB]   Total [MB]  Last Used   Last Used_t Pool    Type
我能够“修复”这一问题的方法是使用记事本删除前四行,并从标题行中删除第一行。该文件如下所示:

Medium ID   Label   Location    Status  Protection  Used [MB]   Total [MB]  Last Used   Last Used_t Pool    Type
id1:id2:id3:id5 [hostname] labelname_31 [Library:     5]    Good    13/08/2018 10:01:41 PM  762699.50   762699.50   14/07/2018 10:00:36 PM  1531828836  Tape Drive Pool LTO-Ultrium
我正试图找到一种方法让PowerShell进行此更改。例如,我尝试使用以下行删除前四行,作为第一步:

(Get-Content $file | Select-Object -Skip 4) | Set-Content $file
该文件似乎会丢失其制表符,因此不再进行分隔


如何删除行以及第一行而不丢失选项卡?提前谢谢

这可以通过这样的方法来实现

$data = Get-Content $file | Select-Object -Skip 4 
$data[0] = $data[0] -replace '^#\s*', ''
现在,如果需要,您可以覆盖该文件:

$data | Set-Content $file -Force
或者将其直接用作Powershell中的对象csv对象是PSObject的数组

$csv = ($data -join [environment]::NewLine) | ConvertFrom-Csv -Delimiter "`t"
或者使用此转换的对象再次写出文件

$csv | Export-Csv -Path $file -Delimiter "`t" -NoTypeInformation -Force

如果您的数据没有包含在其中,那么您可能可以获取内容$file |选择对象-跳过4-替换,|设置内容$file谢谢我尝试了,但它仍然丢失了选项卡。事实上,只需执行Get Content$file | Set Content$file就会丢失选项卡。谢谢。我尝试了你的建议,但他们都产生了一个格式错误的文件,没有tabshum。。。他们都在我的机器上工作。您是否绝对确定输入文件是以制表符分隔的,而不是更像一个固定宽度的文件?您只向我们显示了一行数据,所以我说不出来。如何检查输出文件中的选项卡?记事本或更高级的阅读器,如EditPlus,您可以让它显示这些“隐藏”字符。当我在Notepad++中打开它并搜索\t Extended时,请尝试使用数据->从文本文件->分隔符->选项卡在Excel中读取它,并突出显示单元格之间的所有空格。这就是文件以制表符分隔的证据。同样,如果我在记事本中手动编辑此文件以删除不需要的字符并保存,则会保留选项卡。我只是想知道如何在PowerShell中实现这一点。谢谢。标题也是这样吗?$data-join[environment]:换行符| ConvertFrom Csv-分隔符t`显示什么?