2013-05-22 15 views
8

Korzystanie z programu PowerShell Chciałbym przechwycić dane wprowadzane przez użytkownika, porównać dane wejściowe z danymi w pliku CSV rozdzielanym przecinkami i zapisać odpowiednie dane w zmiennej.Odczytywanie pliku CSV z powłoką powershell i przechwytywanie odpowiednich danych

przykład:

  1. Użytkownik jest proszony o „Store_Number” wchodzą "10".
  2. Dane wejściowe "10" są następnie porównywane z danymi na pierwszej pozycji lub kolumną pliku CSV.
  3. Dane, takie jak "District_Number" w odpowiedniej pozycji/ kolumna jest przechwytywana i zapisywana do zmiennej.

Dostałem tę metodę pracy z plikiem Excel (.xlsx), ale okazało się, że jest bardzo wolno. Mając nadzieję, że PowerShell będzie mógł wydajniej odczytać plik CSV.

link do przykładowego pliku CSV 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

czy możesz udostępnić swój kod? – Bill

Odpowiedz

9

Co powinno być patrząc na to Import-CSV

Po zaimportowaniu CSV można użyć nagłówek kolumny jako zmienna.

Przykład CSV:

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

Teraz zostanie importu CSV i pętlę listę dodać do tablicy. Możemy następnie porównać wprowadzoną wartość do tablicy:

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

I tu jest wyjście:

I Found Sammy

+1

AthomSfere, dzięki za odpowiedź. Skopiowałem twój kod dokładnie zmieniając tylko ścieżkę do pliku i nie generowałem żadnego wyjścia. Co robi też "+ ="? Próbowałem googling, ale znaleźć odniesienia. – squishy79

+0

@ squishy79 Czy wiersz nagłówka na twoich plikach CSV jest dokładnie taki sam? –

+0

Tak, dokładnie to samo. – squishy79

5

więc zorientowali się, co jest nie tak z tym stwierdzeniem:

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

(Oryginał)

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

(Proponowane, musisz użyć ofert; w przeciwnym razie nie zadziała, a ISE da ci błąd)

Wymaga, aby -Delimiter "|", aby zmienna została wypełniona tablicą pozycji. W przeciwnym razie Powershell ISE nie wyświetla listy przedmiotów.

Nie mogę powiedzieć, że poleciłbym operatorowi |, ponieważ jest używany do łączenia cmdletów ze sobą.

Nadal nie mogę uzyskać instrukcji if, która zwróci wartość true i wypisze wartości wprowadzone przez prompt.

Jeśli ktokolwiek może pomóc, byłoby wspaniale. Wciąż doceniam post, był bardzo pomocny!

+0

Wow, stary losowy komentarz, ale to wygląda na lepsze pytanie niż odpowiedź. Krótka odpowiedź, jeśli twój plik używa | jako ogranicznik, to nie jest to technicznie CSV, ale PSV (wartości rozdzielane przez rury) i trzeba by wyraźnie określić ogranicznik. To samo, jeśli użyłeś zakładki, dwukropka, średnika itd. –

2

Stary temat, ale nigdy nie udzielono jednoznacznej odpowiedzi.Pracowałem również nad podobnym rozwiązaniem i znalazłem rozwiązanie:

Rurka (|) w tej próbce kodu z Austin nie jest ogranicznikiem, ale potokiem ForEach-Object, więc jeśli chcesz użyć to jako ogranicznik, trzeba to zrobić:

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

spędził 15 minut na ten sam, zanim zrozumiał, co się dzieje. Mam nadzieję, że odpowiedź pomoże następnej osobie czytającej to uniknięcie zmarnowanych minut! (Przepraszamy za rozszerzenie na twój komentarz Austin)

+0

Dobry połów! Rozumiem, co ez4sheezee próbował rozwiązać w swojej odpowiedzi teraz. –

Powiązane problemy