2015-01-13 2 views
1

Таким образом я получил данные, как это:Разделить строку, содержащую фиксированные colums длины

3LLO24MACT01 24MOB_6012010051700000020100510105010    123456 

Он содержит различные значения для разных столбцов, когда я импортировать его. Каждый столбец имеет фиксированную ширину. Скажем, пол № 1 - это идентификатор и всего 1 длинный. Это значит, что здесь "3". Col # 2 имеет длину 3 и здесь "LLO". Col # 3 имеет длину 9 и "24MACT01 " (обратите внимание, что недостающие заполняются пробелами). Это продолжается для 15 столбцов или около того ...

Есть ли способ быстро вырезать его на разные элементы на основе длины последовательности? Я не мог найти.

ответ

2

Это можно сделать с помощью соответствия RegEx и создания массива пользовательских объектов. Что-то вроде этого:

$AllRecords = Get-Content C:\Path\To\File.txt | Where{$_ -match "^(.)(.{3})(.{9})"} | ForEach{ 
    [PSCustomObject]@{ 
     'Col1' = $Matches[1] 
     'Col2' = $Matches[2] 
     'Col3' = $Matches[3] 
    } 
} 

Это займет каждую линию, матч по сколько символов указаны, а затем создать объект на основе от этих матчей. Он собирает все объекты в массиве и может быть экспортирован в CSV или что-то еще. «Col1», «Col2» и т. Д. - это просто общие заголовки столбцов, которые я предлагал из-за отсутствия лучшей информации, и могли быть любыми, что вы хотели.

Редактировать: Спасибо iCodez за то, что вы показали мне, возможно, непреднамеренно, что вы можете указать язык для своих образцов кода!

3

[Regex]::Matches будет делать это довольно легко. Все, что вам нужно сделать, это указать шаблон Regex, который имеет ., а затем количество символов, которое вы хотите в фигурных скобках. Например, чтобы соответствовать столбцу из трех символов, вы должны написать .{3}. Затем вы делаете это для всех 15 столбцов.

Для демонстрации я буду использовать строку, содержащую первые три колонки вашего примера данных (так как я знаю, их размеры):

PS > $data = '3LLO24MACT01 ' 
PS > $pattern = '(.{1})(.{3})(.{9})' 
PS > ([Regex]::Matches($data, $pattern).Groups).Value 
3LLO24MACT01 
3 
LLO 
24MACT01 
PS > 

Обратите внимание, что первое значение, выводимое будет текст соответствовал бы всем групп захвата. Если вам это не нужно, вы можете удалить его с нарезкой:

$columns = ([Regex]::Matches($data, $pattern).Groups).Value 
$columns = $columns[1..$columns.Length] 
2

Вот вспомогательная функцией для создания PS объектов из регулярных выражений спичек.

New-PSObjectFromMatches

Опция -Debug может помочь в процессе написания регулярных выражений.

Смежные вопросы