Строка положения символа Powershell Cut

Привет, как мне реплицировать этот скрипт BASH в powershell? Он берет базовую строку и захватывает эти определенные фрагменты, помещает канал между ними и записывает их в файл csv. Я знаю, как сделать get-content и вывод в csv, но как лучше всего нарезать строку в powershell?

`cat /app/$filename |cut  -c1-9,19-138,139-198,199-238,239-240,241-245,287-296 --output-delimiter="|" >> /app/CSVs/$filename.csv`

Я использовал split() раньше, но это не похоже на правильный способ сделать это. Я думаю о том, чтобы перебирать каждую строку и сохранять каждую часть этой строки, сохранять в новую строку var и добавлять разделитель для каждого раздела. Это кажется ужасно неэффективным.

Мысли?

Исходный файл структурирован по положению символов с большим количеством пробелов. каждое поле имеет определенное количество пробелов. (Это в основном файл базы данных, но в очень простом формате txt)

1-9 = ID (9 chars long)
19-138 = business_name (120 chars long)
139-198 = address (60 chars long)
198-237 = city (40 chars long)
238-239 = state (2 chars long)
240-244 = zip_code (5 chars long)
286-295 = phone (10 chars long)

Я думаю, что использование $string.substring(char#,length) будет работать с циклом, но чем больше помощи, тем лучше.

Вывод должен выглядеть так

123456789|acme business <lots of spaces>|1234 main st <lots of spaces>|etc...

person wanney    schedule 22.05.2015    source источник
comment
Не могли бы вы предоставить исходный файл и результирующий пример CSV? Является ли исходный файл структурированным (имеет какие-то разделители?) или вы просто берете фрагменты из заранее определенных позиций?   -  person beatcracker    schedule 22.05.2015
comment
добавил информацию в пост. И да, на ваш последний вопрос. Я просто хватаю куски с заранее определенных позиций.   -  person wanney    schedule 22.05.2015


Ответы (1)


Похоже на задание для нового командлета PS 5 ConvertFrom-String:

К сожалению, я еще не пробовал, поэтому не могу привести пример. Но это также можно сделать с помощью регулярного выражения:

Get-Content -Path '.\db.txt' |
    ForEach-Object{$_ -replace '^(.{9})(.{120})(.{60})(.{40})(.{2})(.{5})(.{10})$', '$1|$2|$3|$4|$5|$6|$7'} |
        Set-Content -Path '.\db.csv'

Get-Content \ Set-Content работают довольно медленно , поэтому для ускорения обработки вы можете переключиться на StreamReader\StreamWriter. См. мой ответ на этот вопрос: Более эффективный способ изменить Содержимое CSV-файла, где я использую их в скрипте для ускорения работы.

person beatcracker    schedule 22.05.2015