2017-04-13 15 views
5

konnte ich XML CSV umwandeln, indem Sie den folgenden Code:Powershell - konvertiert XML CSV

#read from file 
[xml]$inputFile = Get-Content "c:\pstest\test.xml" 
#export xml as csv 
$inputFile.Transaction.ChildNodes | Export-Csv "c:\pstest\test.csv" -NoTypeInformation -Delimiter:";" -Encoding:UTF8 

Es funktioniert, wenn die Dateien nur einen Root-Knoten mit einer Art von untergeordneten Knoten enthalten, zum Beispiel:

<?xml version="1.0" encoding="UTF-8"?> 
<Transaction> 
    <TXNDETAIL> 
     <RecordID>02</RecordID> 
     <SequenceNumber>1</SequenceNumber> 
     <TransactionType>01</TransactionType> 
     <ActionCode>01</ActionCode> 
     <TransactionID>17500515552017001</TransactionID> 
     <SellerCode>2200919TRY</SellerCode> 
     <BuyerCode>KOCZER</BuyerCode> 
     <TransactionReference> </TransactionReference> 
     <TransactionDescription1> </TransactionDescription1> 
     <TransactionDescription2> </TransactionDescription2> 
     <DocumentType>01</DocumentType> 
     <DocumentNumber>XXXXXXXXXXX</DocumentNumber> 
     <DocumentDate>20170301</DocumentDate> 
     <DocumentAmount>10000</DocumentAmount> 
     <CurrencyCode>949</CurrencyCode> 
     <TransactionAmount>10000</TransactionAmount> 
     <TransactionDueDate>20170505</TransactionDueDate> 
     <AdditionalInformation1> </AdditionalInformation1> 
     <AdditionalInformation2> </AdditionalInformation2> 
     <HashCode>XXXXXXXX</HashCode> 
    </TXNDETAIL> 
    <TXNDETAIL> 
     <RecordID>02</RecordID> 
     <SequenceNumber>2</SequenceNumber> 
     <TransactionType>01</TransactionType> 
     <ActionCode>01</ActionCode> 
     <TransactionID>17500515622017001</TransactionID> 
     <SellerCode>2200919TRY</SellerCode> 
     <BuyerCode>KOCZER</BuyerCode> 
     <TransactionReference> </TransactionReference> 
     <TransactionDescription1> </TransactionDescription1> 
     <TransactionDescription2> </TransactionDescription2> 
     <DocumentType>01</DocumentType> 
     <DocumentNumber>XXXXXXXXXXX</DocumentNumber> 
     <DocumentDate>20170301</DocumentDate> 
     <DocumentAmount>10000</DocumentAmount> 
     <CurrencyCode>949</CurrencyCode> 
     <TransactionAmount>10000</TransactionAmount> 
     <TransactionDueDate>20170505</TransactionDueDate> 
     <AdditionalInformation1> </AdditionalInformation1> 
     <AdditionalInformation2> </AdditionalInformation2> 
     <HashCode>XXXXXXXX</HashCode> 
    </TXNDETAIL> 
    <TXNDETAIL> 
     <RecordID>02</RecordID> 
     <SequenceNumber>3</SequenceNumber> 
     <TransactionType>01</TransactionType> 
     <ActionCode>01</ActionCode> 
     <TransactionID>17500515972017001</TransactionID> 
     <SellerCode>2200919TRY</SellerCode> 
     <BuyerCode>KOCZER</BuyerCode> 
     <TransactionReference> </TransactionReference> 
     <TransactionDescription1> </TransactionDescription1> 
     <TransactionDescription2> </TransactionDescription2> 
     <DocumentType>01</DocumentType> 
     <DocumentNumber>XXXXXXXXXXX</DocumentNumber> 
     <DocumentDate>20170301</DocumentDate> 
     <DocumentAmount>10000</DocumentAmount> 
     <CurrencyCode>949</CurrencyCode> 
     <TransactionAmount>10000</TransactionAmount> 
     <TransactionDueDate>20170505</TransactionDueDate> 
     <AdditionalInformation1> </AdditionalInformation1> 
     <AdditionalInformation2> </AdditionalInformation2> 
     <HashCode>XXXXXXXX</HashCode> 
    </TXNDETAIL> 
</Transaction> 

Der Ausgang wäre wie:

"RecordID";"SequenceNumber";"TransactionType";"ActionCode";"TransactionID";"SellerCode";"BuyerCode";"TransactionReference";"TransactionDescription1";"TransactionDescription2";"DocumentType";"DocumentNumber";"DocumentDate";"DocumentAmount";"CurrencyCode";"TransactionAmount";"TransactionDueDate";"AdditionalInformation1";"AdditionalInformation2";"HashCode" 
"02";"1";"01";"01";"17500515552017001";"2200919TRY";"KOCZER";"";"";"";"01";"XXXXXXXXXXX";"20170301";"10000";"949";"10000";"20170505";"";"";"XXXXXXXX" 
"02";"2";"01";"01";"17500515622017001";"2200919TRY";"KOCZER";"";"";"";"01";"XXXXXXXXXXX";"20170301";"10000";"949";"10000";"20170505";"";"";"XXXXXXXX" 
"02";"3";"01";"01";"17500515972017001";"2200919TRY";"KOCZER";"";"";"";"01";"XXXXXXXXXXX";"20170301";"10000";"949";"10000";"20170505";"";"";"XXXXXXXX" 

Das ist sehr gut.

hat jedoch die Eingabedatei in Wirklichkeit eine "Kopfzeile" Informationen, die TXNHEAD Tag

<?xml version="1.0" encoding="UTF-8"?> 
<Transaction> 
    <TXNHEAD> 
     <RecordID>01</RecordID> 
     <FileName>001</FileName> 
     <IntermediaryCode>19000033</IntermediaryCode> 
     <ActualizationDate>20170314</ActualizationDate> 
     <SequenceNumber>001</SequenceNumber> 
     <NumberofRecords>3</NumberofRecords> 
     <AmountofRecords>30000</AmountofRecords> 
    </TXNHEAD> 
    <TXNDETAIL> 
     <RecordID>02</RecordID> 
     <SequenceNumber>1</SequenceNumber> 
     <TransactionType>01</TransactionType> 
     <ActionCode>01</ActionCode> 
     <TransactionID>17500515552017001</TransactionID> 
     <SellerCode>2200919TRY</SellerCode> 
     <BuyerCode>KOCZER</BuyerCode> 
     <TransactionReference> </TransactionReference> 
     <TransactionDescription1> </TransactionDescription1> 
     <TransactionDescription2> </TransactionDescription2> 
     <DocumentType>01</DocumentType> 
     <DocumentNumber>XXXXXXXXXXX</DocumentNumber> 
     <DocumentDate>20170301</DocumentDate> 
     <DocumentAmount>10000</DocumentAmount> 
     <CurrencyCode>949</CurrencyCode> 
     <TransactionAmount>10000</TransactionAmount> 
     <TransactionDueDate>20170505</TransactionDueDate> 
     <AdditionalInformation1> </AdditionalInformation1> 
     <AdditionalInformation2> </AdditionalInformation2> 
     <HashCode>XXXXXXXX</HashCode> 
    </TXNDETAIL> 
    <TXNDETAIL> 
     <RecordID>02</RecordID> 
     <SequenceNumber>2</SequenceNumber> 
     <TransactionType>01</TransactionType> 
     <ActionCode>01</ActionCode> 
     <TransactionID>17500515622017001</TransactionID> 
     <SellerCode>2200919TRY</SellerCode> 
     <BuyerCode>KOCZER</BuyerCode> 
     <TransactionReference> </TransactionReference> 
     <TransactionDescription1> </TransactionDescription1> 
     <TransactionDescription2> </TransactionDescription2> 
     <DocumentType>01</DocumentType> 
     <DocumentNumber>XXXXXXXXXXX</DocumentNumber> 
     <DocumentDate>20170301</DocumentDate> 
     <DocumentAmount>10000</DocumentAmount> 
     <CurrencyCode>949</CurrencyCode> 
     <TransactionAmount>10000</TransactionAmount> 
     <TransactionDueDate>20170505</TransactionDueDate> 
     <AdditionalInformation1> </AdditionalInformation1> 
     <AdditionalInformation2> </AdditionalInformation2> 
     <HashCode>XXXXXXXX</HashCode> 
    </TXNDETAIL> 
    <TXNDETAIL> 
     <RecordID>02</RecordID> 
     <SequenceNumber>3</SequenceNumber> 
     <TransactionType>01</TransactionType> 
     <ActionCode>01</ActionCode> 
     <TransactionID>17500515972017001</TransactionID> 
     <SellerCode>2200919TRY</SellerCode> 
     <BuyerCode>KOCZER</BuyerCode> 
     <TransactionReference> </TransactionReference> 
     <TransactionDescription1> </TransactionDescription1> 
     <TransactionDescription2> </TransactionDescription2> 
     <DocumentType>01</DocumentType> 
     <DocumentNumber>XXXXXXXXXXX</DocumentNumber> 
     <DocumentDate>20170301</DocumentDate> 
     <DocumentAmount>10000</DocumentAmount> 
     <CurrencyCode>949</CurrencyCode> 
     <TransactionAmount>10000</TransactionAmount> 
     <TransactionDueDate>20170505</TransactionDueDate> 
     <AdditionalInformation1> </AdditionalInformation1> 
     <AdditionalInformation2> </AdditionalInformation2> 
     <HashCode>XXXXXXXX</HashCode> 
    </TXNDETAIL> 
</Transaction> 

Wenn den gleichen Code der Anwendung, die ich erhalten:

"RecordID";"FileName";"IntermediaryCode";"ActualizationDate";"SequenceNumber";"NumberofRecords";"AmountofRecords" 
"01";"001";"19000033";"20170314";"001";"3";"30000" 
"02";;;;"1";; 
"02";;;;"2";; 
"02";;;;"3";; 

Wenn ich versuche, diese Code stattdessen nur den Kopf abzurufen:

#read from file 
[xml]$inputFile = Get-Content "c:\pstest\test.xml" 
#export xml as csv 
$inputFile.Transaction.TXNHEAD.ChildNodes | Export-Csv "c:\pstest\test.csv" -NoTypeInformation -Delimiter:";" -Encoding:UTF8 

ich:

"#text" 
"01" 
"001" 
"19000033" 
"20170314" 
"001" 
"3" 
"30000" 

Was ich zu erreichen versuche, ist dieser Ausgang:

"RecordID";"FileName";"IntermediaryCode";"ActualizationDate";"SequenceNumber";"NumberofRecords";"AmountofRecords" 
"01";"001";"19000033";"20170314";"001";"3";"30000" 
"RecordID";"SequenceNumber";"TransactionType";"ActionCode";"TransactionID";"SellerCode";"BuyerCode";"TransactionReference";"TransactionDescription1";"TransactionDescription2";"DocumentType";"DocumentNumber";"DocumentDate";"DocumentAmount";"CurrencyCode";"TransactionAmount";"TransactionDueDate";"AdditionalInformation1";"AdditionalInformation2";"HashCode" 
"02";"1";"01";"01";"17500515552017001";"2200919TRY";"KOCZER";"";"";"";"01";"XXXXXXXXXXX";"20170301";"10000";"949";"10000";"20170505";"";"";"XXXXXXXX" 
"02";"2";"01";"01";"17500515622017001";"2200919TRY";"KOCZER";"";"";"";"01";"XXXXXXXXXXX";"20170301";"10000";"949";"10000";"20170505";"";"";"XXXXXXXX" 
"02";"3";"01";"01";"17500515972017001";"2200919TRY";"KOCZER";"";"";"";"01";"XXXXXXXXXXX";"20170301";"10000";"949";"10000";"20170505";"";"";"XXXXXXXX" 

Was mache ich falsch?

Antwort

2

Das erste Objekt (oder Select-Object usw.) in einer Pipeline definiert den Header für die Ausgabe, unabhängig davon, ob es sich um eine Datei- oder Konsolenausgabe handelt.

Was Sie tun könnten, ist sie in zwei Runden in CSV konvertieren und fügen Sie es in die gleiche Datei. Ex:

$inputFile.Transaction.TXNHEAD | ConvertTo-Csv -NoTypeInformation -Delimiter ";" | Set-Content -Path "c:\pstest\test.csv" -Encoding UTF8 
$inputFile.Transaction.TXNDETAIL | ConvertTo-Csv -NoTypeInformation -Delimiter ";" | Add-Content -Path "c:\pstest\test.csv" -Encoding UTF8 

Sie können auch sie wie folgt zusammenfassen:

$inputFile.Transaction.TXNHEAD, $x.Transaction.TXNDETAIL | 
ForEach-Object { $_ | ConvertTo-Csv -NoTypeInformation -Delimiter ";" } | 
Set-Content -Path "c:\pstest\test.csv" -Encoding UTF8 
+0

Da er Informationen will geben in CSV sein, besser nicht zählen die 'NoTypeInformation' Flagge. – Vesper

+0

Er tut es nicht. Lesen Sie noch einmal –

+1

Hmm. Er sagte: "Ich möchte die folgende Ausgabe:" und die Ausgabe enthält eine Informationszeile, beginnend mit 'RecordID'. Bitte überprüfen Sie den letzten Codeblock in der Frage. – Vesper