0
votes

Comparez 2 colonnes en CSV et créez une nouvelle colonne si elle correspond

J'ai un script PowerShell qui fait une requête SQL de plusieurs bases de données. Cela dépit des résultats dans un fichier CSV sur mon bureau. J'aimerais que le script PowerShell comparaisse 2 des colonnes, créez une nouvelle colonne si elles correspondent.

Cela me sauve juste le temps de faire le comparateur à chaque fois dans Excel. P>

I ne sais pas assez sur PowerShell pour faire cela. p>

Les résultats actuels dans le CSV sont comme celui-ci. p> xxx pré>

Je voudrais que le script modifie le script à modifier le CSV à fais cela. p> xxx pré>

ive a vu plusieurs scripts comment comparer plusieurs CSV et faire une nouvelle ... mais je préférerais simplement modifier celui qui est créé à partir de la requête SQL . P>

Si cela aide ... Voici une copie et coller du fichier CSV que j'ai modifié le numéro de téléphone pour protéger le client ... Je visuelle le CSV à Exel. P>

"ID","Phone","PhoneID"
"5521350","1112223333","1112223333"


10 commentaires

Ce n'est pas un CSV cependant


Je ne vois pas comment c'est pas un CSV ..


@ BND10706 - S'il s'agissait d'une CSV, les valeurs ne seraient pas centrées sous les en-têtes de colonne. Peu importe ce que le délimiteur était, cette mise en page n'est pas ce que l'on bénéficie d'un fichier de caractèreValue. ///// que obtenez-vous de $ queryresult.gettype () ?


J'ai formaté pour être mieux visualisé.


@ BND10706 - Veuillez seulement poster des données d'échantillonnage comme c'est vraiment. Vous gaspillez votre temps ... et d'autres personnes avec des données d'échantillonnage falsifiées.


Je précise, il y a des numéros de téléphone client et des données de l'entreprise dans le CSV .. Je l'ai édité de toute façon pour protéger cela. Si cela aide vraiment à ne pas centrer des colonnes, je le ferai. Il a été simplement fait pour la compréhension visuelle et honnêtement ne devrait rien changer.


Ouvrez le CSV dans le bloc-notes et copiez-la et collez-la


@Lee_Dailey j'ai ajouté une copie et coller avec seulement le téléphone édité ... Je ne vois rien de quelque chose.


@PatrickMcVay Merci merci ... Je n'utilise pas trop souvent CSV et normalement ouvert à Excel.


@ BND10706 - La version Notepad est la vraie. Merci d'avoir posté cela ... Cela fait beaucoup plus de sens de votre question. [ Grin ]


3 Réponses :


1
votes
$Data = Import-Csv "file.csv"
ForEach ($obj in $Data) {
$hashtable = [ordered]@{}
ForEach ($property in $obj.PSObject.properties.name) { $hashtable[$property] = $obj.$property }
$hashtable["match?"] = If ($obj.'PhoneNumber' -eq $obj.'PhoneNumberInDB2') {"Y"} Else {"N"}
$Data = $Data -ne $obj
$Data += New-Object -TypeName PSObject -Property $Hashtable
}

4 commentaires

Merci pour l'aide .. Je reçois une erreur quand j'ai essayé cela. L'invocation de la méthode a échoué parce que [System.Management.Automation.psObject] ne contient pas de méthode nommée 'op_addition'. À la liste téléphonique.ps1: 97 Char: 1 + $ Data + = nouvel objet -Typename psobject -property $ hashtable + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ CatégorieInfo: InvalidOperation: (op_addition: chaîne) [], RunTimeException + EntièrementQualifiedError: MethodnotFoundNound


Quel est votre format de fichier CSV? Semble que vous n'imposez pas un fichier correct.


Je vois la méthode de cette approche, mais je pense que c'est le long chemin. Il n'y a aucune raison de créer synthétiquement une table de hachage, notamment pour convertir ultérieurement à un objet. PowerShell a plusieurs méthodes natives pour apporter des propriétés supplémentaires aux objets. Vous devez également éviter l'opérateur + = pour les matrices d'ajout.


D'accord, votre approche est beaucoup plus élégante.



1
votes

Si je lis cela correctement peut-être que vous pouvez utiliser select-objet pour ajouter la propriété aux objets entrants. On dirait que les 2 propriétés que vous comparez sont dans le même objet à tout moment. Donc, vous devriez être capable d'obtenir cela sur un seul tuyau ...

Quelque chose comme: xxx

Remarque: j'ai supprimé le "?" sur la nouvelle propriété (colonne) Nom.

Si vous devez réexporter pour réexporter pour réexporter le même fichier CSV, simplement tuyau $ données à exportation-csv : xxx

ci-dessus suppose que vous souhaitez réutiliser le nom du fichier si vous souhaitez modifier le nom, vous pouvez le mettre dans un seul pipeline comme: xxx

Remarque: cette révision ne nécessite pas $ données . Parce que tout est sur le pipeline, il est plus efficace de mémoire. Bien que ce n'est pas normalement une question à moins que le fichier soit très important.


5 commentaires

Cela semble fonctionner, mais je ne reçois aucun résultat ni des erreurs. Il n'y a pas de colonne dans la correspondance nommée CSV si cela va ...


Ok je l'ai essayé dans un nouveau script PS et il ne comparait toujours pas ... Désolé, je ne sais juste pas assez de PS pour comprendre pourquoi pas


J'ai joué avec cela à quelques reprises dans l'exécution du script après le SQL séparément et qu'il ne reçoit toujours aucun résultat. Je ne sais pas si ce CSV classifie ces titres de colonne de SQL comme des en-têtes ou non.


La façon dont il est écrit, il stocke les objets dans une variable. Il ne s'agira donc pas de générer une sortie et de ne pas changer le fichier. Je mettrai à jour la réponse avec une version légèrement modifiée pour recréer le fichier.


ok merci ... J'ai plusieurs fichiers qui ont plus de 4000 lignes longues et cela me sauvera un tas de temps à l'avenir



1
votes

Voici encore une autre façon de faire le travail ... [ Grin em>] Qu'est-ce que c'est ...

  • Factes Lecture dans un fichier CSV
    Lorsque vous êtes prêt à le faire pour réel, remplacez simplement l'intégralité de la région # de la région / # EndRegion Code> avec un importateur-csv code> appel. Li>
  • iTère à travers la collection li>
  • crée un nouvel objet avec les propriétés souhaitées li>
  • compare les deux numéros de téléphone et enregistre celui-ci au Samevronenumber Code> Propriété
    Vous pouvez remplacer ces éléments faux / true code> avec n / y code> si recherché. Il suffit d'échanger les marqueurs de commentaire sur la ligne 19 et 20. Si vous effectuez plus de traitement, le FAUX / TRUE CODE> Stuff fonctionne mieux que de simples lettres car elles sont converties automatiquement en Boolean à Posh. li>
  • envoie le nouvel objet à la Durttuff code> Collection Li>
  • montre que sur l'écran li> ul>

    le code ... p> xxx pré>

    sortie avec des booléens ... p> xxx pré>

    sortie avec N / Y CODE> ... P>

    ID      Phone      PhoneId    SamePhoneNumber
    --      -----      -------    ---------------
    5521350 1112223333 1112223333 Y              
    2020202 2020202020 2000000002 N              
    3030303 3030303030 3030303030 Y              
    4040404 4040404040 4000000004 N
     
    


0 commentaires