Извлечение столбцов из текстового файла с помощью PowerShell - PullRequest
9 голосов
/ 23 марта 2010

Мне нужно извлечь столбцы из текстового файла, описанного в этом посте:

Извлечение столбцов из текстового файла с использованием однострочного Perl: аналогично Unix cut

но я должен сделать это также в Windows Server 2008, на котором не установлен Perl. Как я могу сделать это с помощью PowerShell? Есть идеи или ресурсы? Я PowerShell Noob ...

Ответы [ 4 ]

13 голосов
/ 23 марта 2010

Попробуйте это:

Get-Content test.txt | Foreach {($_ -split '\s+',4)[0..2]}

И если вы хотите, чтобы данные в этих столбцах печатались в одной строке:

Get-Content test.txt | Foreach {"$(($_ -split '\s+',4)[0..2])"}

Обратите внимание, что для этого требуется PowerShell 2.0 для оператора -split. Кроме того, ,4 сообщает оператору разделения максимальное количество строк, которое вы хотите, но имейте в виду, что последняя строка всегда будет содержать все дополнительные конкатеты.

Для столбцов фиксированной ширины, вот один подход для ширины столбца, равной 7 ($ w = 7):

$res = Get-Content test.txt | Foreach {
           $i=0;$w=7;$c=0; `
           while($i+$w -lt $_.length -and $c++ -lt 2) {
               $_.Substring($i,$w);$i=$i+$w-1}}

$ res будет содержать каждый столбец для всех строк. Чтобы установить максимальное количество столбцов, измените значение $c++ -lt 2 с 2 на другое значение. Возможно, есть более элегантное решение, но сейчас у него нет времени, чтобы обдумать его. : -)

5 голосов
/ 23 марта 2010

Предполагается, что этот код должен быть разделен пробелами.

$fileName = "someFilePath.txt"
$columnToGet = 2
$columns = gc $fileName | 
   %{ $_.Split(" ",[StringSplitOptions]"RemoveEmptyEntries")[$columnToGet] }
1 голос
/ 24 марта 2010

Для обычных 、

type foo.bar | % { $_.Split(" ") | select -first 3 }
0 голосов
/ 22 сентября 2017

Попробуй это. Это поможет при необходимости пропустить начальные строки, извлечь / перебрать столбцы, отредактировать данные столбца и перестроить запись:

$header3 = @("Field_1","Field_2","Field_3","Field_4","Field_5")     

Import-Csv $fileName -Header $header3 -Delimiter "`t" | select -skip 3 | Foreach-Object {

    $record = $indexName 
    foreach ($property in $_.PSObject.Properties){

        #doSomething $property.Name, $property.Value

            if($property.Name -like '*CUSIP*'){

                $record = $record + "," + '"' + $property.Value + '"' 
            }
            else{
                $record = $record + "," + $property.Value 
            }                           
    }               

        $array.add($record) | out-null  
        #write-host $record                         
}
...