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:
- é pedido a um utilizador um "
Store_Number
", que introduza "10
". - a entrada, "
10
" é então comparada com os dados na primeira posição ou coluna do ficheiro CSV. - 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
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:
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)
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!