2010-03-23 99 views

Répondre

12

Essayez ceci:

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

Et si vous voulez que les données contenues dans ces colonnes imprimées sur la même ligne:

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

Notez que cela nécessite PowerShell 2.0 pour l'opérateur -split. En outre, le ,4 indique à l'opérateur de fractionnement le nombre maximal de chaînes fractionnées que vous voulez mais gardez à l'esprit que la dernière chaîne contiendra toujours tous les extras concat'és.

Pour les colonnes de largeur fixe, voici une approche pour la largeur de colonne égale à 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 contiendront chaque colonne pour toutes les lignes. Pour définir les colonnes max, modifiez $c++ -lt 2 de 2 à autre chose. Il y a probablement une solution plus élégante, mais je n'ai pas le temps maintenant de la méditer. :-)

+0

Merci, mais cela ne semble pas fonctionner. Je cours PowerShell 2 et essaie d'extraire les deux premières colonnes de mon fichier .dat à largeur fixe (fichier texte) – atricapilla

+1

L'exemple de coupure que vous liez utilise un délimiteur d'espace et saisit les colonnes 1 à 3. Si cela ne s'applique pas à votre cas, pouvez-vous indiquer quelles sont vos exigences? Cela ressemble à une largeur de colonne fixe au lieu d'être délimitée. Si oui, quelle est la largeur de la colonne? –

+0

Mes données sont dans un fichier texte de largeur fixe (espaces entre). J'ai modifié votre code et j'ai obtenu ceci: Get-Content text.txt | Foreach {"$ ($ _. Split() [0..2])"}. Cela me rapproche beaucoup, mais cela génère des rangs de rangs supplémentaires entre les lignes. – atricapilla

4

En supposant que c'est un espace blanc délimité ce code devrait faire.

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

J'ai essayé comme C:.> \ Extract_Two_Columns_From_Text_File.ps1> twocols.dat Mais il n'a rien imprimé? – atricapilla

0

Pour ordinaire,

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

Si vous avez plusieurs espaces entre les colonnes (assez commun) cela produira un tas d'entrées vides. C'est pourquoi Jared utilise la valeur enum [StringSplitOptions] :: RemoveEmptyEntries. –

+0

Oui, cela produit le même résultat: Get-Content text.txt | Foreach {"$ ($ _. Split() [0..2])"}. – atricapilla

+0

J'ai aussi essayé ceci: Get-Content text.txt | Foreach {"$ ($ _. Split (" ", [StringSplitOptions] :: RemoveEmptyEntries)) [0..2])"}, mais produit toujours ces lignes vides. – atricapilla

0

essayer. Cela vous aidera à ignorer les lignes initiales si vous voulez, extrait/itérer colonnes, modifier les données de la colonne et de reconstruire le disque:

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