我有文本文件,其中数据由正斜杠分隔。它很容易导入并将其提供给自定义对象,但文件包含包含分隔符的标题。示例如下:
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基于回车和/或斜线?
答案 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