2010-03-23 17 views

Antwort

12

Versuchen Sie folgendes:

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

Und wenn Sie die Daten in diesen Spalten wollen auf der gleichen Zeile gedruckt:

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

Beachten Sie, dass dies erfordert Powershell 2.0 für den -split Operator. Außerdem teilt der ,4 dem Split-Operator die maximale Anzahl von Split-Strings mit, die Sie möchten, aber denken Sie daran, dass der letzte String immer alle Concat'd enthält.

Für feste Breite Spalten, hier ist ein Ansatz für die Spaltenbreite gleich 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 wird jede Spalte für alle Zeilen enthalten. Um die maximalen Spalten zu setzen, ändern Sie $c++ -lt 2 von 2 zu etwas anderem. Es gibt wahrscheinlich eine elegantere Lösung, aber momentan habe ich keine Zeit, darüber nachzudenken. :-)

+0

Danke, aber das scheint nicht zu funktionieren. Ich führe PowerShell 2 aus und versuche, die ersten beiden Spalten aus meiner .dat-Datei mit fester Breite (Textdatei) zu extrahieren. – atricapilla

+1

Das Schnittbeispiel, zu dem Sie eine Verknüpfung herstellen, verwendet ein Leerzeichentrennzeichen und packt die Spalten 1 bis 3. Wenn dies nicht zutrifft Fall, kannst du angeben, was deine Anforderungen sind? Klingt wie feste Spaltenbreite statt abgegrenzt. Wenn ja, wie groß ist die Spaltenbreite? –

+0

Meine Daten befinden sich in einer Textdatei mit fester Breite (Leerzeichen dazwischen). Ich habe deinen Code geändert und habe folgendes bekommen: Get-Content text.txt | Foreach {"$ ($ _. Split() [0..2])"}. Das bringt mich ziemlich nah, aber das erzeugt zusätzliche Reihenbrüche zwischen den Reihen. – atricapilla

4

Angenommen, es ist weißen Raum begrenzt diesen Code tun sollte.

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

Ich habe versucht, diese wie . C:> \ Extract_Two_Columns_From_Text_File.ps1> twocols.dat Aber es hat nichts gedruckt? – atricapilla

0

gewöhnlichen,

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

Wenn Sie mehrere Spalten zwischen den Spalten haben (ziemlich häufig), erzeugt dies eine Reihe von leeren Einträgen. Aus diesem Grund verwendet Jared den Enum-Wert [StringSplitOptions] :: RemoveEmptyEntries. –

+0

Ja, das erzeugt das gleiche: Get-Content text.txt | Foreach {"$ ($ _. Split() [0..2])"}. – atricapilla

+0

Ich habe es auch versucht: Get-Content text.txt | Foreach {"$ ($ _. Split (" ", [StringSplitOptions] :: RemoveEmptyEntries)) [0..2])"}, aber es erzeugt immer noch diese leeren Zeilen. – atricapilla

0

bereits. Dies wird dazu beitragen anfänglichen Zeilen zu überspringen, wenn Sie wollen, Extrakt/durch Spalten durchlaufen, bearbeiten Sie die Spaltendaten und erstellen Sie den Datensatz:

$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       
} 
Verwandte Themen