从分隔的文本文件中删除标题

时间:2017-08-22 18:59:20

标签: powershell text delimited-text

我有文本文件,其中数据由正斜杠分隔。它很容易导入并将其提供给自定义对象,但文件包含包含分隔符的标题。示例如下:

HEADER LINE 1/INFO/MOREINFO
HEADER LINE 2/INFO/MOREINFO
HEADER LINE 3/INFO/MOREINFO
HEADER LINE 4/INFO/MOREINFO
HEADER LINE 5/INFO/MOREINFO
HEADER LINE 6/INFO/MOREINFO
HEADER LINE 7/INFO/MOREINFO

LINE1A/1B///1E/1F/1G/1H
LINE2A/2B/2C//2E//2G/2H
...
/END/

线条" LINE1A"," LINE1B"等具有我需要导入的数据。使用-split '/'可以让我将所有内容拆分成一个不错的数组,但前提是该标题不存在。

$data = (Get-Content text.txt).Replace('Line', '/Line') -split('/')

如果标头存在,$data数组中的第一个元素包括标题。

我尝试过字符串操作技巧,但不幸的是,标题文本与下一个文件不一致。行数(总是7)和斜杠数(每个标题行2个)是一致的,但每行中的文本各不相同。

由于Get-Content产生的数组被分割为回车(如果我错了,请纠正我),虽然我可以删除前7个数组元素。此代码用于删除第一个元素:

$data = (Get-Content text.txt) 
$data = $data | Where-Object {$_ -ne $data[0]}

但它的可扩展性不高。我不想7次循环命令。有没有更优雅的方式来做到这一点?也许一些RegEx基于回车和/或斜线?

3 个答案:

答案 0 :(得分:4)

这里简单的东西,使用Select-Object cmdlet跳过前7行!

$data = (Get-Content text.txt | Select -Skip 7).replace('Line','/Line') -split('/')

如果第8行出现空行,您可能希望跳过前8行。

答案 1 :(得分:0)

将文件读入数组$data后,只需将除前7行数据外的所有数据复制到新数组

 $data2 = $data[7..($data.length-1)]

然后使用$data2

答案 2 :(得分:0)

如果数字和行不可信,我会提供其他内容。让我们过滤掉以标题或结尾开头的所有行并过滤空行。然后让我们像Import-CSV那样

创建自定义对象
$fileContents = Get-Content "file"
$csv = $fileContents | Where-Object{![string]::IsNullOrWhiteSpace($_) -and $_ -notmatch "^(HEADER|/END/)"}
# Determine the number of headers from the file 'CSV' line
$numberOfHeaders = $csv[0].split("/").Count
ConvertFrom-Csv $csv -Header (1..$numberOfHeaders|ForEach-Object{"LINE $_"}) -Delimiter "/"

这样可以使用您的示例输入数据,而忽略省略号。因此,如果使用IMport-CSV,您现在可以使用相应的CSV。标题是我猜测。如果出现其他需求,不需要做太多改变。

LINE 1 LINE 2 LINE 3 LINE 4 LINE 5 LINE 6 LINE 7 LINE 8
------ ------ ------ ------ ------ ------ ------ ------
1A     1B                   1E     1F     1G     1H    
2A     2B     2C            2E            2G     2H    

如果你不需要领先的" LINE" on the data 然后一个简单的管道将在转换之前修复它

ForEach-Object{$_ -replace "^LINE"}

如果您想从标题中删除它,请使用此1..$numberOfHeaders|ForEach-Object{"LINE $_"}。因此,如果您只使用编号的列,则可以将其保留在1..$numberOfHeaders