2010-03-23 43 views
8

tôi phải trích xuất các cột từ một tập tin văn bản giải thích trong bài này:cột Trích xuất từ ​​file văn bản sử dụng PowerShell

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

nhưng tôi phải làm điều này cũng trong một Windows Server 2008 mà không có Perl Cài đặt. Làm thế nào tôi có thể làm điều này bằng cách sử dụng PowerShell? Bất kỳ ý tưởng hay tài nguyên nào? Tôi là PowerShell noob ...

Trả lời

12

Hãy thử điều này:

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

Và nếu bạn muốn dữ liệu trong các cột được in trên cùng một dòng:

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

Lưu ý rằng điều này đòi hỏi PowerShell 2.0 cho các nhà điều hành -split. Ngoài ra, các ,4 nói với các nhà điều hành chia số lượng tối đa của chuỗi phân chia mà bạn muốn nhưng hãy ghi nhớ chuỗi cuối cùng sẽ luôn luôn chứa tất cả các tính năng bổ sung concat'd.

Đối với cột chiều rộng cố định, đây là một cách tiếp cận để độ rộng cột bằng 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 sẽ chứa mỗi cột cho tất cả các hàng. Để đặt các cột tối đa, hãy thay đổi $c++ -lt 2 từ 2 thành thứ khác. Có lẽ có một giải pháp thanh lịch hơn nhưng không có thời gian để suy nghĩ về nó. :-)

+0

Cảm ơn, nhưng điều này dường như không hoạt động. Tôi đang chạy PowerShell 2 và cố gắng trích xuất hai cột đầu tiên từ tệp .dat có độ rộng cố định của tôi (tệp văn bản) – atricapilla

+1

Ví dụ đã cắt mà bạn liên kết sử dụng dấu tách cách và lấy các cột từ 1 đến 3. Nếu điều này không áp dụng trường hợp của bạn, bạn có thể nêu rõ yêu cầu của bạn là gì? Âm thanh như chiều rộng cột cố định thay vì được phân tách. Nếu vậy, chiều rộng cột là bao nhiêu? –

+0

Dữ liệu của tôi nằm trong tệp văn bản có chiều rộng cố định (khoảng cách giữa). Tôi đã sửa đổi mã của bạn và nhận được mã này: Get-Content text.txt | Foreach {"$ ($ _. Split() [0..2])"}. Điều này giúp tôi khá gần, nhưng điều này tạo ra hàng bổ sung breks giữa các hàng. – atricapilla

4

Giả sử khoảng trắng của nó được phân tách bằng mã này nên thực hiện.

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

Tôi cố gắng này như C:.> \ Extract_Two_Columns_From_Text_File.ps1> twocols.dat Nhưng nó không in được gì? – atricapilla

0

Để bình thường,

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

Nếu bạn có các khoảng trống giữa các cột (khá phổ biến), điều này sẽ tạo ra một loạt các mục trống. Đây là lý do tại sao Jared sử dụng giá trị enum [StringSplitOptions] :: RemoveEmptyEntries. –

+0

Có, điều này cũng giống nhau: Get-Content text.txt | Foreach {"$ ($ _. Split() [0..2])"}. – atricapilla

+0

Tôi cũng đã thử điều này: Get-Content text.txt | Foreach {"$ ($ _. Split (" ", [StringSplitOptions] :: RemoveEmptyEntries)) [0..2])"}, nhưng nó vẫn tạo ra những dòng trống. – atricapilla

0

Hãy thử điều này. Điều này sẽ giúp bỏ qua các hàng ban đầu nếu bạn muốn, chiết xuất/lặp qua cột, chỉnh sửa dữ liệu cột và xây dựng lại các kỷ lục:

$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       
} 
Các vấn đề liên quan