2017-07-28 1 views
-2

Pouvons-nous convertir ci-dessous fichier txt au format CSV ajouté à la fin?Besoin de convertir le fichier txt en CSV (avec en-têtes) en utilisant PowerShell

fichier texte:

 
IP Address: 192.168.1.1 
Hostname: 01-any1TEST 
Event Message: Ping 
Alert Status: Down at least 3 min 
Event Time: 17:25:14 
Alert Type: :Windows 2012 Server 
------------------------------------------------------------------------------------- 
IP Address: 192.168.1.2 
Hostname: 02-any2TEST 
Event Message: Ping 
Alert Status: Down at least 4 min 
Event Time: 17:25:40 
Alert Type: :Unix Server 
------------------------------------------------------------------------------------- 
IP Address: 192.168.1.3 
Hostname: 03-any3TEST 
Event Message: Ping 
Alert Status: Down at least 3 min 
Event Time: 17:26:21 
Alert Type: :windows host 
------------------------------------------------------------------------------------- 

sortie fichier CSV requis comme ci-dessous:

 
'IP Address','Hostname','Event Message','Alert Status','Event Time','Alert Type' 
'192.168.1.1','01-any1TEST','Ping','Down at least 3 min','17:26:21','Windows 2012 Server ' 
'192.168.1.2','02-any2TEST','Ping','Down at least 3 min','17:26:21','unix host ' 
'192.168.1.3','03-any3TEST','Ping','Down at least 3 min','17:26:21','windows host ' 
+4

C'est possible, l'avez-vous essayé? – arco444

+0

oui. $ input = Get-Content -path "chemin \ Bureau \ in.txt" | Select-String -List 'Type d'alerte', 'Adresse IP', 'Nom d'hôte', 'Message d'événement', 'Statut d'alerte', 'Heure d'événement' $ data = $ input [1 .. ($ input.Length - 1)] $ maxLength = 0 –

+0

$ objects = ForEach ($ enregistrement dans $ data) { $ split = $ record -split "\ s {2,} | \ t +" If ($ split.Length -gt $ maxLength) { $ maxLength = $ split.Longueur } $ props = @ {} Pour ($ i = 0; $ i -lt $ split.Longueur; $ i ++) { $ props.Add ([Chaîne]) ($ i + 1), $ split [$ i]) } Nouveau-Objet -TypeName PSObject -Property $ props } $ headers = [Chaîne []] (0 .. $ longueur max) $ heade rs1 = [Chaîne []] ('MachineType', 'EventTime', 'HostName', 'IPAddress', 'AlertMessage', 'Gravité', 'AlertType', 'AlertStatus') $ objets | Sélectionner-Objet $ en-têtes | Export-Csv -NoTypeInformation -Path "path \ out.csv" –

Répondre

1

est ici une façon que vous pouvez le faire:

$logFile = "logfile.txt" 

$delimeterPattern = '^####' 
$recordPattern = '^([^:]+): (.+)' 

# how many lines in a record? 
$recordLines = Select-String $delimeterPattern $logFile -List | 
    Select-Object -ExpandProperty LineNumber 

$logContent = Get-Content $logFile 
for ($i = 0; $i -lt $logContent.Count; $i += $recordLines) { 
    $output = New-Object PSObject 
    for ($j = $i; $j -lt $i + $recordLines; $j++) { 
    $logContent[$j] | Select-String $recordPattern | ForEach-Object { 
     $output | Add-Member NoteProperty $_.Matches[0].Groups[1].Value $_.Matches[0].Groups[2].Value 
    } 
    } 
    $output 
} 

Pour écrire dans un fichier CSV, mettez ci-dessus dans un script et le tuyau à Export-Csv.

+0

Vous avez obtenu l'erreur ci-dessous: export-csv: Impossible d'ajouter le contenu CSV au fichier suivant: C: \ output_temp.csv. L'objet ajouté n'a pas de propriété correspondant à la colonne suivante:. Pour continuer avec les propriétés incompatibles , ajoutez le paramètre -Force, puis réessayez la commande . À la ligne: 17 char: 12 + $ production | export-csv "$ tempfile" -notypeinformation -append –

+0

SI j'ajoute l'option -force toujours en dessous de l'erreur: export-csv: Impossible de traiter l'argument car la valeur de l'argument "name" n'est pas valide. Modifiez la valeur de l'argument "name" et réexécutez l'opération. À la ligne: 17 ombles: 12 + sortie $ | export-csv "tempfile de $" -notypeinformation -append -Force + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: InvalidArgument: (:) [Export-Csv], PSArgumentException + FullyQualifiedErrorId: Argument, Microsoft.PowerShell.Commands.ExportCsvCommand –

+0

Vous avez besoin de mettre ci-dessus dans un fichier de script, par exemple le nom 'getlog.ps1'. Exécutez le script et dirigez la sortie du script vers CSV. par exemple. 'getlog.ps1 | Export-Csv output.csv -NoTypeInformation'. –

0

J'espère que cela résoudra votre problème:

Function Convert2CSV() 
{ 
    param($logFile, $csvFile) 

    "'IP Address','Hostname','Event Message','Alert Status','Event Time','Alert Type'" | Out-File $csvFile 

    get-content $logFile -Delimiter "-------------------------------------------------------------------------------------" | &{ process{ 
     $IsValidMatch=$_ -match "IP Address: (.*)\r\nHostname: (.*)\r\nEvent Message: (.*)\r\nAlert Status: (.*)\r\nEvent Time: (.*)\r\nAlert Type: (.*)\r\n" 
     if($IsValidMatch) 
     { 
      $nextLine="'$($matches[1])','$($matches[2])','$($matches[3])','$($matches[4])','$($matches[5])','$($matches[6])'" | Out-File $csvFile -Append 
     } 
    }} 
} 

appeler Enfin la fonction Convert2CSV et définissez votre fichier journal et votre fichier de sortie en tant que paramètre:

Convert2CSV -logFile .\1.txt -csvFile 3.txt 
+0

il ne traite que le premier enregistrement dans le fichier. Avons-nous besoin d'ajouter une boucle ici? –

+0

l'essayer;). Il procédera le fichier complet. – Krisz

0
$delimeterPattern = '^--' 
$recordPattern = '^([^:]+): (.+)' 

$logContent = Get-Content "logfile.txt" 

# how many lines in a record? 
$recordLines = ($logContent | Select-String $delimeterPattern | 
Select-Object -First 1).LineNumber 

for ($i = 0; $i -lt $logContent.Count; $i += $recordLines) { 
$output = New-Object PSObject 
for ($j = $i; $j -lt $i + $recordLines; $j++) { 
$logContent[$j] | Select-String $recordPattern | ForEach-Object { 
    $output | Add-Member NoteProperty $_.Matches[0].Groups[1].Value 
$_.Matches[0].Groups[2].Value 
    } 
} 
$output 
} 

Mise à jour seprator $ delimeterPattern = '^ -' à $ delimeterPattern = '^ ####'.

+0

Votre exemple vous mettez dans votre question utilise '-', pas de caractères' 'des # de - donc bien sûr il ne fonctionnait pas comme je l'Envoyé. Vous devez fournir des informations correctes dans votre question. J'ai mis à jour ma réponse avec '#' et vous pouvez la marquer comme réponse. –

+0

D'accord, fait. –