2010-03-23 3 views
8

я должен извлечь столбцы из текстового файла описано в этом посте:Извлечение столбцов из текстового файла с помощью PowerShell

Extracting columns from text file using Perl one-liner: similar to Unix cut

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

ответ

12

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

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 сообщает оператору split о максимальном количестве разделяемых строк, но помните, что последняя строка всегда будет содержать все дополнения concat'd.

Для фиксированных колонн ширины, вот один подхода к ширине столбца, равной 7 ($ ш = 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}} 

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

+0

Спасибо, но это не работает. Я запускаю PowerShell 2 и пытаюсь извлечь первые два столбца из моего файла .dat с фиксированной шириной (текстовый файл) – atricapilla

+1

Пример вырезания, на который вы ссылаетесь, использует разделитель пробелов и захватывает столбцы с 1 по 3. Если это не относится к ваше дело, можете ли вы указать, что ваши требования? Звучит как фиксированная ширина столбца вместо разделителя. Если да, то какова ширина столбца? –

+0

Мои данные в текстовом файле с фиксированной шириной (пробелы между ними). Я изменил ваш код и получил следующее: Get-Content text.txt | Foreach {"$ ($ _. Split() [0..2])"}. Это приближает меня, но это создает дополнительные строки строк между строками. – atricapilla

4

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

$fileName = "someFilePath.txt" 
$columnToGet = 2 
$columns = gc $fileName | 
    %{ $_.Split(" ",[StringSplitOptions]"RemoveEmptyEntries")[$columnToGet] } 
+0

Я попробовал это, как C:.> \ Extract_Two_Columns_From_Text_File.ps1> twocols.dat Но ничего не печатали? – atricapilla

0

Для обычных,

 
type foo.bar | % { $_.Split(" ") | select -first 3 } 
+0

Если у вас есть пробелы между столбцами (довольно распространенные), это создаст кучу пустых записей. Вот почему Джаред использует значение перечисления [StringSplitOptions] :: RemoveEmptyEntries. –

+0

Да, это дает то же самое: Get-Content text.txt | Foreach {"$ ($ _. Split() [0..2])"}. – atricapilla

+0

Я пробовал также это: Get-content text.txt | Foreach {"$ ($ _. Split (" ", [StringSplitOptions] :: RemoveEmptyEntries)) [0..2])"}, но он все равно создает эти пустые строки. – atricapilla

0

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

$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       
} 
Смежные вопросы