Ler um ficheiro Csv com powershell e capturar os dados correspondentes

Usando o PowerShell, gostaria de capturar a entrada do utilizador, comparar a entrada com os dados num ficheiro CSV delimitado por vírgulas e escrever os dados correspondentes a uma variável.

exemplo:

  1. é pedido a um utilizador um "Store_Number", que introduza "10".
  2. a entrada, "10" é então comparada com os dados na primeira posição ou coluna do ficheiro CSV.
  3. dados, tais como "District_Number " na posição correspondente / a coluna é capturada e escrita a variavel.

consegui que este método funcionasse com um arquivo Excel (.xlsx) mas descobriram que era terrivelmente lento. Esperando que o PowerShell possa ler um ficheiro CSV de forma mais eficiente.

ligação para um ficheiro CSV exemplo aqui:

Store_Number,Region,District,NO_of_Devices,Go_Live_Date
1,2,230,10,2/21/2013
2,2,230,10,2/25/2013
3,2,260,12,3/8/2013
4,2,230,10,3/4/2013
5,2,260,10,3/4/2013
6,2,260,10,3/11/2013
7,2,230,10,2/25/2013
8,2,230,10,3/4/2013
9,2,260,10,5/1/2013
10,6,630,10,5/23/2013
Author: Sk8erPeter, 2013-05-22

3 answers

O que você deve estar olhando é Import-Csv

Assim que importar o CSV, poderá usar o cabeçalho da coluna como variável.

Exemplo CSV:

Name  | Phone Number | Email
Elvis | 867.5309     | [email protected]
Sammy | 555.1234     | [email protected]

Agora vamos importar o CSV, e loop através da lista para adicionar a um array. Podemos então comparar o valor de entrada com o array:

$Name = @()
$Phone = @()

Import-Csv H:\Programs\scripts\SomeText.csv |`
    ForEach-Object {
        $Name += $_.Name
        $Phone += $_."Phone Number"
    }

$inputNumber = Read-Host -Prompt "Phone Number"

if ($Phone -contains $inputNumber)
    {
    Write-Host "Customer Exists!"
    $Where = [array]::IndexOf($Phone, $inputNumber)
    Write-Host "Customer Name: " $Name[$Where]
    }

E aqui está a saída:

I Found Sammy

 12
Author: Austin T French, 2013-05-22 04:14:29

Assunto antigo, mas nunca respondeu claramente. Eu tenho trabalhado em similar também, e encontrei a solução:

O tubo (|) nesta amostra de código de Austin não é o delimitador, mas para canalizar o objeto-ForEach, então se você quiser usá-lo como delimitador, você precisa fazer isso:

Import-Csv H:\Programs\scripts\SomeText.csv -delimiter "|" |`
ForEach-Object {
    $Name += $_.Name
    $Phone += $_."Phone Number"
}
Passei uns bons 15 minutos nisto antes de perceber o que se estava a passar. Espero que a resposta ajude a próxima pessoa a ler isto evitar os minutos desperdiçados! (Desculpe por expandir o seu comentário Austin)
 8
Author: Nils E Lie, 2017-06-13 07:47:13
Então descobri o que se passa com esta declaração:
Import-Csv H:\Programs\scripts\SomeText.csv |`

(Original)

Import-Csv H:\Programs\scripts\SomeText.csv -Delimiter "|"

(proposto, você deve usar citações; caso contrário, ele não vai funcionar e ISE lhe dará um erro)

É necessário o -Delimiter "|", para que a variável seja povoada com um conjunto de itens. Caso contrário, o PowerShell ISE não mostra a lista de itens.

Não posso dizer que recomendaria o operador {[[3]}, Uma vez que é usado para canalizar cmdlets em um outro.

Ainda não consigo obter a declaração if para devolver verdadeiro e enviar os valores introduzidos através da linha de comandos.

Se mais alguém puder ajudar, seria óptimo. Eu ainda aprecio o post, tem sido muito útil!
 6
Author: ez4sheezee, 2013-12-16 23:40:18