Извлечение нескольких столбцов из нескольких тестовых файлов в powershell - PullRequest
0 голосов
/ 23 февраля 2020

Я получил 450 файлов из расчетов вычислительной модели для наносистемы. Каждый из этих файлов содержит три верхние строки с названием, условиями и датой / временем. Четвертая строка имеет метки столбцов (xyztnm lag lead bus cond rema dock). С пятой строки данные начинаются до 55-й строки. Есть несколько пробелов в качестве разделителя. Пробелы не зафиксированы. Я хочу, чтобы я) создал новые текстовые файлы только с оставшимися столбцами xyznm Ii II) Я хочу, чтобы только xyz и n значений всех текстовых файлов в одном файле Как это сделать в powershell, plz help!

1 Ответ

2 голосов
/ 23 февраля 2020

Исходя из вашего описания, я думаю, что содержимое ваших файлов выглядит примерно так:

Title: MyFile
Conditions: Critical
Date: 2020-02-23T11:33:02
x y z t n m lag lead bus cond rema dock
sdasd asdfafd  awef   wefaewf aefawef aefawrgt eyjrteujer bhtnju  qerfqeg   524rwefqwert  q3tgqr4fqr4 qregq5g
avftgwb ryhwtwtgqreg  efqerfe   rgwetgq ergqreq erwf ef 476j q4 w4th2   ef 42r13gg   asdfasdrv

Вы всегда можете прочитать такие файлы, набирая их, построчно и сохраняя только те строки, которые вы на самом деле хочу. В вашем случае данные находятся в строке 4-55 (включая заголовки).

Чтобы получить эти данные, вы можете использовать эту команду:

Get-Content MyFile.txt | Select-Object -skip 3 -First 51

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

Поскольку (количество) пробелов не является фиксированным, вам нужно заменить несколько пробелов одним пробелом , Предполагая, что значения, которые вы ищете, без пробелов, вы можете добавить это в свой конвейер:

Get-Content C:\MyFile.txt | Select-Object -skip 3 -First 51 | ForEach-Object {$_ -replace '( )+',' '}

Часть '() +' означает один или несколько пробелов.

Теперь вы иметь правильные данные CSV. Чтобы преобразовать это в правильный объект, вам просто нужно преобразовать данные из csv следующим образом:

ConvertFrom-Csv -InputObject (Get-Content C:\MyFile.txt | Select-Object -skip 3 -First 51 | ForEach-Object {$_ -replace '( )+',' '}) -Delimiter ' '

Отсюда довольно просто выбрать нужные значения:

ConvertFrom-Csv -InputObject (Get-Content C:\MyFile.txt | Select-Object -skip 3 -First 51 | ForEach-Object {$_ -replace '( )+',' '}) -Delimiter ' ' | Select-Object x,y,z,n,m,rema

Вам также нужно завершить все файлы, поэтому вы можете начать с файлов, подобных этим:

foreach ($file in (Get-Content C:\MyFiles)){
    ConvertFrom-Csv -InputObject (Get-Content $file.fullname | Select-Object -skip 3 -First 51 | ForEach-Object {$_ -replace '( )+',' '}) -Delimiter ' ' | Select-Object x,y,z,n,m,rema
}

Возможно, вы захотите разделить код на более читаемый формат, но это должно в значительной степени покрыть это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...