Jak przekonwertować powtarzające się węzły xml na ciąg rozdzielany przecinkami za pomocą powershell
Mam około 13000 plików dziennika sformatowanych w formacie XML i muszę je przekonwertować na arkusz CSV.
Jak zobaczysz, nie jestem programistą, ale próbowałem.
Napisałem skrypt powershell, aby wyprowadzić pierwsze węzły i utworzyć ciąg rozdzielany przecinkami, ale utknąłem z uzyskaniem ostatniego węzła, który może zawierać wszystko, od żadnych wpisów do dziesiątek.
przykład pliku xml:
<?xml version="1.0" encoding="utf-8"?>
<MigrationUserStatus>
<User>[email protected]</User>
<StoreList>
<EmailMigrationStatus>
<MigrationStatus value="Success" />
<FolderList>
<TotalCount value="6" />
<SuccessCount value="3" />
<FailCount value="3" />
<FailedMessages>
<ErrorMessage>GDSTATUS_BAD_REQUEST:Permanent failure: BadAttachment</ErrorMessage>
<SentTime>1601-01-01T00:00:00.000Z</SentTime>
<ReceiveTime>1601-01-01T00:00:00.000Z</ReceiveTime>
</FailedMessages>
<FailedMessages>
<ErrorMessage>GDSTATUS_BAD_REQUEST:Permanent failure: BadAttachment</ErrorMessage>
<SentTime>1601-01-01T00:00:00.000Z</SentTime>
<ReceiveTime>1601-01-01T00:00:00.000Z</ReceiveTime>
</FailedMessages>
<FailedMessages>
<MessageSubject>Hey</MessageSubject>
<ErrorMessage>GDSTATUS_BAD_REQUEST:Permanent failure: BadAttachment</ErrorMessage>
<SentTime>2013-01-07T02:51:17.000Z</SentTime>
<ReceiveTime>2013-01-07T02:51:17.000Z</ReceiveTime>
<MessageSize value="2881" />
</FailedMessages>
<StartTime>2013-01-07T01:52:46.000Z</StartTime>
<EndTime>2013-01-07T04:41:59.000Z</EndTime>
</FolderList>
<StartTime>2013-01-07T01:52:43.000Z</StartTime>
<EndTime>2013-01-07T04:41:59.000Z</EndTime>
</EmailMigrationStatus>
<StartTime>2013-01-07T01:52:43.000Z</StartTime>
<EndTime>2013-01-07T04:41:59.000Z</EndTime>
</StoreList>
</MigrationUserStatus>
Dzięki temu kodowi mogę łatwo uzyskać pierwsze części utworzonej linii CSV:
$folder = "C:\temp"
$outfile = = [IO.File]::OpenWrite("alluserslogs.csv")
$csv = "User,Total Emails, Successful emails,Failed emails,Failures`r`n"
dir Status-*.log | foreach ( $_) {
[xml]$Status = Get-Content $_
$csvpt1 +=$Status.MigrationUserStatus.User + "," + $Status.MigrationUserStatus.StoreList.EmailMigrationStatus.FolderList.TotalCount.value + "," + $Status.MigrationUserStatus.StoreList.EmailMigrationStatus.FolderList.SuccessCount.value + "," + $Status.MigrationUserStatus.StoreList.EmailMigrationStatus.FolderList.FailCount.value
Następnym krokiem jest odejście. Chcę odczytać każdy węzeł FailedMessages i zbudować go na innym ciągu rozdzielanym przecinkami
foreach ($FMessage in $Status.MigrationUserStatus.StoreList.EmailMigrationStatus.FolderList.FailedMessages) {
$csvpt2 +=$FMessage + ","
}
Pożądane wyjście:
GDSTATUS_BAD_REQUEST:Permanent failu... 1601-01-01T00:00:00.000Z 1601-01-01T00:00:00.000Z,GDSTATUS_BAD_REQUEST:Permanent failu... 1601-01-01T00:00:00.000Z 1601-01-01T00:00:00.000Z,.......
Dostaję puste miejsce w $ FMessage lub wywołanie metody nie powiodło się z powodu + „,” na końcu, więc muszę to naprawić.
następnie połączę się w jeden ostatni ciąg i napiszę do pliku
$csv +=$csvpt1 + "," + $csvpt2
$outfile.WriteLine($csv)
}
$outfile.Close()
W dodanej liście życzeń wspaniale byłoby również móc utworzyć nagłówek kolumny pliku CSV Niepowodzenia dla n liczby kolumn, jak pokazano w największej liczbie węzłów FailedMessages.
Twoja pomoc jest bardzo mile widziana.