web-dev-qa-db-fra.com

Lire un fichier Csv avec PowerShell et capturer les données correspondantes

À l'aide de PowerShell, je voudrais capturer l'entrée utilisateur, comparer l'entrée aux données dans un fichier CSV délimité par des virgules et écrire les données correspondantes dans une variable.

Exemple:

  1. Un utilisateur est invité à saisir "Store_Number", ils entrent "10 ".
  2. L'entrée, "10 ”Est ensuite comparé aux données de la première position ou colonne du fichier CSV.
  3. Des données, telles que "District_Number ”Dans la position/colonne correspondante est capturé et écrit dans une variable.

J'ai réussi à faire fonctionner cette méthode avec un fichier Excel (.xlsx) mais je l'ai trouvé terriblement lent. En espérant que PowerShell puisse lire un fichier CSV plus efficacement.

Lien vers un exemple de fichier CSV ici :

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
13
squishy79

Ce que vous devriez regarder est Import-Csv

Une fois que vous avez importé le CSV, vous pouvez utiliser l'en-tête de colonne comme variable.

Exemple CSV:

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

Maintenant, nous allons importer le CSV et parcourir la liste pour l'ajouter à un tableau. On peut alors comparer la valeur entrée au tableau:

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

Et voici la sortie:

I Found Sammy

14
Austin T French

Ancien sujet, mais jamais clairement répondu. J'ai également travaillé sur des produits similaires et j'ai trouvé la solution:

Le tuyau (|) dans cet exemple de code d'Austin n'est pas le délimiteur, mais pour diriger le ForEach-Object, donc si vous voulez l'utiliser comme délimiteur, vous devez le faire:

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

J'ai passé 15 bonnes minutes là-dessus avant de comprendre ce qui se passait. J'espère que la réponse aidera la prochaine personne à lire ceci à éviter les minutes perdues! (Désolé de développer votre commentaire Austin)

9
Nils E Lie

J'ai donc compris ce qui ne va pas avec cette déclaration:

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

(Original)

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

(Proposé, vous devez utiliser des devis; sinon, cela ne fonctionnera pas et ISE vous donnera une erreur)

Il nécessite le -Delimiter "|", pour que la variable soit remplie avec un tableau d'éléments. Sinon, Powershell ISE n'affiche pas la liste des éléments.

Je ne peux pas dire que je recommanderais le |, car il est utilisé pour canaliser les applets de commande les unes dans les autres.

Je ne parviens toujours pas à obtenir l'instruction if pour renvoyer true et afficher les valeurs entrées via l'invite.

Si quelqu'un d'autre peut aider, ce serait formidable. J'apprécie toujours le message, il a été très utile!

6
ez4sheezee