2017-08-10 5 views
3

J'ai quelques fichiers journaux au format txt qui contiennent des colonnes à double onglet. J'utilise l'PowerShell suivante:Est-il possible de traiter les délimiteurs consécutifs en utilisant Import-Csv?

Import-Csv C:\path\to\file\PageLog.txt -Delimiter "`t" | Export-Csv C:\path\to\file\PageLog.csv -NoTypeInformation 

donc rien de fou là-bas, et il fonctionne, mais je me retrouve avec une colonne vide avec un en-tête H1 généré automatiquement. Alors est-il possible pour moi de traiter ces deux onglets comme un lors de l'importation via l'onglet "Données" dans Excel? Ou en quelque sorte omettre la colonne H1 vide pendant Export-Csv?

+1

Utilisez '... | Sélectionnez * -ExcludeProperty H1 | ... ', voir: https://stackoverflow.com/a/40085445/1701026 – iRon

Répondre

2

Malheureusement, les délimiteurs Import-CSV ne peuvent contenir qu'un seul caractère. Cela vous laisse avec deux options. La première consiste à utiliser l'analyse de chaîne sur le fichier pour descendre à un délimiteur.

(Get-Content C:\path\to\file\PageLog.txt) -replace "`t`t","`t" | Out-File C:\path\to\file\PageLog.temp.txt 
Import-Csv C:\path\to\file\PageLog.temp.txt -Delimiter "`t" | Export-Csv C:\path\to\file\PageLog.csv -NoTypeInformation 

Dans cette méthode, vous pouvez ignorer l'importation/exportation et simplement remplacer par une virgule.

(Get-Content C:\path\to\file\PageLog.txt) -replace "`t`t",',' | Out-File C:\path\to\file\PageLog.temp.txt 

Sinon, vous pouvez importer le fichier csv avec des colonnes supplémentaires et filtrer. Comme IRON suggère, si vous avez seulement une colonne supplémentaire, vous pouvez simplement exclure:

Import-Csv C:\path\to\file\PageLog.txt -Delimiter "`t" | 
    Select-Object * -ExcludeProperty H1 | 
    Export-Csv C:\path\to\file\PageLog.csv -NoTypeInformation 

Si vous avez des multiples, Select-Object prend en charge les caractères génériques pour que vous puissiez utiliser -ExcludeProperty H* avec l'hypothèse qu'aucun de vos autres colonnes a commencé avec H.

Sinon, vous pourriez utiliser une regex contre les noms de colonnes.

$CSV = Import-Csv C:\path\to\file\PageLog.txt -Delimiter "`t" 
$GoodColumns = $CSV | 
    Get-Member -MemberType NoteProperty | 
    Where-Object {$_.name -notmatch '^H\d+$'} | 
    Select-Object -ExpandProperty Name 
$CSV | Select-Object $GoodColumns | Export-Csv C:\path\to\file\PageLog.csv -NoTypeInformation 
+0

L'exclusion de la colonne H1 après Import était la solution la plus rapide et la plus simple. Au début, j'ai essayé la cmdlet Get-Content, mais il semble que -replace n'était pas un paramètre valide? – Heath

+0

@Heath J'ai oublié d'inclure la commande Get-Content, '-replace' n'est pas un paramètre mais l'opérateur regex. Réponse mise à jour – BenH

+0

Yup la réponse mise à jour fonctionne très bien aussi. Je vous remercie! – Heath

1

Vous devriez être en mesure d'exécuter une recherche/remplacement fonction sur le .csv (remplacer deux onglets consécutifs avec un, non?)

Je ne sais pas si Import-Csv permettra -replace, mais sinon , vous pouvez convertir le fichier .csv en une chaîne (voir Powershell Converting .csv format (Import-csv) to string), exécuter -replace dessus, puis le convertir en .csv.

+0

Vous avez raison et la recherche/remplacement a été ma première pensée, mais j'ai un tas à faire maintenant et aller de l'avant, donc je ne voulais pas tant de modification manuelle du fichier journal. Merci pour le lien btw c'est très bien. – Heath