2013-05-22 10 views
8

Uso di PowerShell Vorrei acquisire l'input dell'utente, confrontare l'input con i dati in un file CSV delimitato da virgole e scrivere i dati corrispondenti in una variabile.Leggere un file CSV con PowerShell e acquisire i dati corrispondenti

Esempio:

  1. Un utente è richiesta una “Store_Number”, entrano "10".
  2. L'input "10" viene quindi confrontato con i dati nella prima posizione o nella colonna del file CSV.
  3. I dati, come "District_Number" nella corrispondente posizione/ colonna vengono acquisiti e scritti in una variabile.

Ho ottenuto questo metodo per lavorare con un file Excel (.xlsx) ma ho trovato che è terribilmente lento. Sperando che PowerShell possa leggere un file CSV in modo più efficiente.

collegamento a un file CSV esempio here:

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 
+0

puoi condividere il tuo codice? – Bill

risposta

9

Che cosa si dovrebbe essere guardando è Import-Csv

Una volta importato il file CSV è possibile utilizzare l'intestazione di colonna come variabile.

Esempio CSV:

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

ora ci importare il file CSV, e scorrere l'elenco per aggiungere ad un array. Possiamo quindi confrontare l'ingresso valore alla matrice:

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

Ed ecco l'output:

I Found Sammy

+1

AthomSfere, grazie per la risposta. Ho copiato il tuo codice cambiando esattamente solo il percorso del file e non ho fatto alcun output. Inoltre cosa fa il "+ ="? Ho provato a cercarlo su google, ma ho trovato riferimenti. – squishy79

+0

@ squishy79 La riga di intestazione dei tuoi CSV è esattamente la stessa? –

+0

Sì, esattamente lo stesso. – squishy79

5

Così ho capito ciò che è sbagliato con questa affermazione:

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

(originale)

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

(Proposta, è necessario utilizzare le citazioni; altrimenti, non funzionerà e ISE ti darà un errore)

Richiede il -Delimiter "|", in modo che la variabile venga popolata con una serie di elementi. In caso contrario, Powershell ISE non visualizza l'elenco degli articoli.

Non posso dire che consiglierei l'operatore |, poiché è usato per collegare i cmdlet l'uno con l'altro.

Non riesco ancora a ottenere l'istruzione if per restituire true e restituire i valori immessi tramite il prompt.

Se qualcun altro può aiutare, sarebbe fantastico. Apprezzo ancora il post, è stato molto utile!

+0

Wow, vecchio commento casuale ma sembra una domanda migliore della risposta. Risposta breve, se il tuo file sta usando il | pipe come delimitatore quindi non è tecnicamente un CSV ma un PSV (Pipe Separated Values) e dovresti esplicitamente indicare il delimitatore. Lo stesso vale se hai usato tab, colon, punto e virgola ecc. –

2

Vecchio argomento, ma mai risposta chiara.Ho lavorato anche a simili, e ho trovato la soluzione:

La pipe (|) in questo esempio di codice da Austin non è il delimitatore, ma per il pipe di ForEach-Object, quindi se si desidera utilizzare come delimitatore, è necessario fare questo:

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

trascorso una buona 15 minuti su questo me stesso prima di capire cosa stava succedendo. Spero che la risposta aiuti la prossima persona a leggere questo evita i minuti sprecati! (Siamo spiacenti per l'espansione sul tuo commento Austin)

+0

Buona cattura! Capisco cosa stava cercando di risolvere ez4sheezee nella sua risposta ora. –