2010-03-23 14 views

Odpowiedz

12

Spróbuj tego:

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

A jeśli chcesz dane w tych kolumnach drukowane na tej samej linii:

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

pamiętać, że wymaga to PowerShell 2.0 dla operatora -split. Ponadto, ,4 informuje operatora podziału maksymalną liczbę rozszczepionych łańcuchów, ale pamiętaj, że ostatni ciąg będzie zawsze zawierał wszystkie dodatki połączone.

Dla stałych kolumn szerokości, oto jedno podejście do szerokości kolumny równej 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 będzie zawierać każdą kolumnę dla wszystkich wierszy. Aby ustawić maks. Kolumny zmień $c++ -lt 2 z 2 na coś innego. Prawdopodobnie istnieje bardziej eleganckie rozwiązanie, ale nie mamy teraz czasu, aby to rozważyć. :-)

+0

Dzięki, ale to nie działa. Używam programu PowerShell 2 i próbuję wyodrębnić pierwsze dwie kolumny z pliku .dat o stałej szerokości. (Plik tekstowy). – atricapilla

+1

Ten przykład wycięcia, do którego prowadzi łącze, używa ogranicznika przestrzeni i przechwytuje kolumny od 1 do 3. Jeśli to nie dotyczy Twoja sprawa, czy możesz podać swoje wymagania? Brzmi jak stała szerokość kolumny zamiast ograniczonej. Jeśli tak, jaka jest szerokość kolumny? –

+0

Moje dane są w pliku tekstowym o stałej szerokości (odstępy między). Zmodyfikowałem twój kod i otrzymałem: Get-Content text.txt | Foreach {"$ ($ _. Split() [0..2])"}. To sprawia, że ​​jestem dość blisko, ale generuje to dodatkowe rzędy między wierszami. – atricapilla

4

Zakładając, że jest to biały znak rozdzielony, ten kod powinien.

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

Próbowałem to jak . C:> \ Extract_Two_Columns_From_Text_File.ps1> twocols.dat Ale nic nie wydrukowało? – atricapilla

0

zwykłych,

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

Jeśli masz wiele spacji między kolumnami (dość często), spowoduje to kilka pustych wpisów. Właśnie dlatego Jared używa wartości wyliczeniowej [StringSplitOptions] :: RemoveEmptyEntries. –

+0

Tak, daje to to samo: Get-Content text.txt | Foreach {"$ ($ _. Split() [0..2])"}. – atricapilla

+0

Próbowałem również: Get-Content text.txt | Foreach {"$ ($ _. Split (" ", [StringSplitOptions] :: RemoveEmptyEntries)) [0..2])"}, ale nadal tworzy puste linie. – atricapilla

0

Spróbuj tego. Pomoże to pomiń początkowe wiersze, jeśli chcesz, wyciąg/iterację kolumny, zmień dane kolumn i odbudować rekord:

$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       
} 
Powiązane problemy