2010-03-23 71 views

Respuesta

12

Prueba esto:

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

Y si desea que los datos de esas columnas impresas en la misma línea:

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

en cuenta que esto requiere PowerShell 2.0 para el operador -split. Además, el ,4 le dice al operador de división la cantidad máxima de cadenas de división que desea, pero tenga en cuenta que la última cadena siempre contendrá todos los parámetros concat'd.

Para las columnas de ancho fijo, aquí es un enfoque para ancho de columna igual a 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 contendrán cada columna para todas las filas. Para establecer las columnas máximas, cambie $c++ -lt 2 de 2 a otra cosa. Probablemente haya una solución más elegante, pero no tengo tiempo ahora para considerarla. :-)

+0

Gracias, pero esto no parece funcionar. Estoy ejecutando PowerShell 2 e intento extraer las dos primeras columnas de mi archivo .dat de ancho fijo (archivo de texto) – atricapilla

+1

El ejemplo de corte al que se vincula usa un delimitador de espacio y toma las columnas 1 a 3. Si esto no se aplica a su caso, ¿puede decir cuáles son sus requisitos? Suena como el ancho de columna fijo en lugar de delimitado. Si es así, ¿cuál es el ancho de columna? –

+0

Mis datos están en un archivo de texto de ancho fijo (espacios entre). Modifiqué tu código y obtuve esto: Get-Content text.txt | Foreach {"$ ($ _. Split() [0..2])"}. Esto me acerca bastante, pero esto genera breks de filas adicionales entre filas. – atricapilla

4

Suponiendo que esté delimitado por un espacio en blanco, este código debería serlo.

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

yo probamos este como C:.> \ Extract_Two_Columns_From_Text_File.ps1> twocols.dat Pero no imprime nada? – atricapilla

0

Para ordinaria,

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

Si tiene varios espacios entre columnas (bastante común), esto generará un montón de entradas vacías. Es por eso que Jared usa el valor enum [StringSplitOptions] :: RemoveEmptyEntries. –

+0

Sí, esto produce lo mismo: Get-Content text.txt | Foreach {"$ ($ _. Split() [0..2])"}. – atricapilla

+0

Intenté también esto: Get-Content text.txt | Foreach {"$ ($ _. Split (" ", [StringSplitOptions] :: RemoveEmptyEntries)) [0..2])"}, pero aún produce esas líneas vacías. – atricapilla

0

probar esto. Esto ayudará a saltar filas iniciales si lo desea, el extracto/iterar a través de columnas, editar los datos de columna y reconstruir el expediente:

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