Saltar al contenido

Cómo guardar cada línea de archivo de texto como array a través de powershell

Posterior a de una extensa recopilación de datos pudimos solucionar este asunto que tienen ciertos usuarios. Te compartimos la solución y deseamos resultarte de gran ayuda.

Solución:

los Get-Content El comando devuelve cada línea de un archivo de texto como un archivo separado. stringpor lo que le dará un array (siempre y cuando no utilice el -Raw parámetro; lo que hace que todas las líneas se combinen en una sola string).

[string[]]$arrayFromFile = Get-Content -Path 'C:USERDocumentsCollectionscollection.txt'

En su excelente respuesta, mklement0 brinda muchos más detalles sobre lo que realmente sucede cuando llama a este comando, así como enfoques alternativos si le preocupa el rendimiento por encima de la conveniencia. Definitivamente vale la pena leerlo si está interesado en aprender más sobre el idioma en lugar de simplemente resolver este requisito único.

Para complementar la útil respuesta de JohnLBevan:

Get-Contentcomo un cmdletobjetos de salida uno a uno al tubería, a medida que estén disponibles. (Tenga en cuenta que una tubería está involucrada incluso cuando se invoca un cmdlet en ausencia del símbolo de tubería, |para encadenar múltiple comandos).
En este caso, los objetos de salida son los individuales líneas del archivo de texto de entrada.

Si usted recolectar los objetos de salida de una canalizacióncomo por asignarlo a una variable tal como $arrayFromFile o usando la canalización en el contexto de una expresión más grande con (...):

  • Potencia Shell capturas múltiple objetos de salida en un creado automáticamente arrayde tipo [object[]],
  • pero si solo hay una objeto de salida, ese objeto es capturado como es (sin un array envoltura)

En orden para garantizar que la salida de una tubería sea siempre un arrayPowerShell ofrece @(...)los array-operador de subexpresiónque envuelve incluso la salida de un solo objeto en un array.

Por lo tanto, los Solución idiomática de PowerShell es:

$arrayFromFile = @(Get-Content C:USERDocumentsCollectionscollection.txt)

Sin embargo, a menudo no es necesario asegurarse de que usted siempre recibir un arrayporque PowerShell trata escalares (valores únicos que no son colecciones) lo mismo que arreglos (colecciones) en muchos contextos, como en foreach declaraciones o al generar un valor para ser enumerado en la canalización.

TheMadTechnician señala que usted también puede usar [Array] para emitir / restringir el tipo de salida de canalización como una alternativa a @(...)que también crea [object[]] arreglos:

# Equivalent of the command above that additionally locks in the variable date type.
[Array] $arrayFromFile = Get-Content C:USERDocumentsCollectionscollection.txt

Mediante el uso [Array] $arrayFromFile = ... en vez de $arrayFromFile = [Array] (...)variable $arrayFromFile se convierte tipo restringidolo que significa que su tipo de datos está bloqueado (mientras que, de manera predeterminada, PowerShell le permite cambiar el tipo de una variable en cualquier momento).

[Array] es una alternativa independiente de comandos a la específico del tipo elenco utilizado en la respuesta de John, [string[]]; puede usar este último para hacer cumplir el uso de un tipo uniforme en todo el arrayelementos de , pero eso a menudo no es necesario en PowerShell[1]

.

Las matrices regulares de PowerShell son del tipo [object[]], que permite mezclar elementos de diferentes tipos, pero cualquier elemento dado todavía tiene un tipo específico; por ejemplo, aunque el tipo de $arrayFromFile después de que el comando anterior es [object[]]el tipo de $arrayFromFile[0]es decir, el primer elemento, por ejemplo, es [string] (asumiendo que el archivo contenía al menos 1 línea; verifique el tipo con $arrayFromFile[0].GetType().Name).


Alternativa más rápida: uso directo del marco .NET

Los cmdlets y la canalización ofrecen características de alto nivel que pueden limitar la memoria y que son expresivas y convenientes, pero pueden ser lento.

Cuando el rendimiento es importante, es necesario el uso directo de los tipos de .NET Framework, como [System.IO.File] en este caso.

$arrayFromFile = [IO.File]::ReadAllLines('C:USERDocumentsCollectionscollection.txt')

Tenga en cuenta cómo el System. prefix se puede omitir del nombre del tipo.

  • Como en la respuesta de John, esto devolverá un [string[]] array.

  • Advertencias:

    • Ten cuidado con relativo rutas, ya que .NET normalmente tiene un diferente directorio actual que PowerShell; para solucionar esto, siempre pasa absoluto caminospor ejemplo con "$PWD/collection.txt".

    • La codificación predeterminada de .NET es UTF-8, mientras que Windows PowerShell el valor predeterminado es la codificación “ANSI”, es decir, la página de códigos heredada del entorno local del sistema; Potencia Shell Centro, por el contrario, también tiene como valor predeterminado UTF-8. Utilizar Get-Encoding‘s -Encoding parámetro o el .ReadAllLines() sobrecarga que acepta una instancia de codificación para especificar explícitamente la codificación de caracteres del archivo de entrada.


[1] Por lo general, las conversiones de tipo de tiempo de ejecución implícitas de PowerShell no pueden proporcionar la misma seguridad de tipo que obtendría en C#, por ejemplo. P.ej, [string[]] $a = 'one', 'two'; $a[0] = 42 lo hace no causar un error: PowerShell simplemente convierte silenciosamente [int]42 a un string.

$array = Get-Content -Path @("C:tmpsample.txt")
foreach($item in $array)

 write-host $item 
 

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *