-2
votes

Importer le fichier CSV à partir d'une valeur d'en-tête spécifique

J'essaie d'importer un fichier CSV. Il a des données aléatoires sur le dessus et je ne peux pas sauter les lignes car je ne suis pas sûr d'où se termine les données aléatoires. Il y aura 2 lignes vides et, après cela, il y a des en-têtes et des données souhaitées.

permet de dire que les données aléatoires ressemblent à ceci "AD Group", "ID utilisateur", "Propriété", "NtDomain \ Médecins", "Sattar" "activé" "NtDomain \ Médecins", "Shayla" "Désactivé" "NTDomain \ infirmières", "mjane", "activé"

"AD Groupe", "DonnéName", "ObjectClass", "Nom", "Nom" ... Morecolumns
"NTDomain \ utilisateurs", "utilisateur1", "utilisateur", "utilisateur", "1" "NTDomain \ user2", "utilisateur1", "utilisateur", "user1_1", "2"

Comment puis-je importer les données sous les en-têtes (nom de famille, nom, nom). Aussi je veux juste choisir des colonnes?


5 commentaires

Savez-vous à quoi ressemblera la ligne d'en-tête, ou pouvez-vous être confiant qu'aucune ligne avant la ligne d'en-tête ne commence par «nom»?


Ce fichier aura plusieurs en-têtes 1 = A, B, C et sous celui-ci, il aura un autre ensemble d'en-tête 2 = nom, téléphone, ville et nom sera toujours un en-tête.


Donc, vous auriez besoin de détecter le démarrage des données comme l'en-tête "Nom Phone ..." et la fin des données par l'en-tête "A B C". Et analyser manuellement chaque ligne. Ou, utilisez un fichier temporaire, où vous enregistrez des données filtrées (à l'aide de la détection de démarrage de données / extrémité par des en-têtes), puis importer le fichier Temp.


Vos exemples de données sont délimités par des espaces, mais votre commentaire indique une virgule?


Si j'ouvre le fichier dans le bloc-notes, il affiche les données telles que "A", "B", "C" "" W "," DD "," Q "" U "," P "", "A", "Nom", "Phone_number", "City", "State" "2", "Nick", "Nick", "Newyork", "NY" "0", "Mike", "112-223 -2222 "," Richmond "," VA "La rangée souhaitée a plus de colonnes, mais je ne veux obtenir que des colonnes. De plus, je veux aussi ignorer la première colonne de la sélection.


3 Réponses :


0
votes
## Read the file into an array, line-terminated
$f = [System.Io.File]::GetAllLines('path-to-csv')

## Stage the array to receive the filtered results
$clean = @()

## Loop through each entry in the file
for ($i = 0; $i -lt $f.count; $i++) {

   ## When the CSV header is found, filter the results and exit
   if ($f[$i] -eq "Name Phone_Number City") {
      $clean = $f[($i..($f.count - 1))]
      break
   }
}

## Turn the string array[] into and object that can be used in PowerShellese
$clean = $clean | convertfrom-csv

0 commentaires

0
votes

Quelque chose comme ceci est un motif que vous pouvez tester avec l'utilisation de ici Strings comme entrée plutôt qu'un gros fichier. Très semblable à la réponse de ThePip3r. En outre, il apparaît que votre entrée n'utilise pas virgade comme délimiteur, donc spécifié espace . xxx


0 commentaires

2
votes

à condition que la ligne d'en-tête soit fixe et peut être utilisée comme séparateur,
J'utiliserais une regex avec un Lookahead positif :

Name Phone_Number City
---- ------------ ----
Nick 800-524-8763 NewYork
Mike 112-223-2222 Richmond


0 commentaires