2017-04-13 13 views
5

tôi đã có thể chuyển đổi XML để CSV bằng cách sử dụng đoạn mã sau:Powershell - chuyển đổi 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 

Nó hoạt động nếu các tập tin chứa chỉ có một nút gốc với một loại nút con, ví dụ:

<?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> 

Kết quả sẽ như thế nào:

"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" 

Đó là tuyệt vời.

Tuy nhiên, tập tin đầu vào trong thực tế có một "dòng tiêu đề" Thông tin, thẻ TXNHEAD

<?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> 

Khi áp dụng cùng mã, tôi nhận được:

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

Khi tôi đang cố gắng này để thay thế chỉ để lấy đầu:

#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 

Tôi nhận được:

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

Những gì tôi đang cố gắng để đạt được, là đầu ra này:

"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" 

Tôi đang làm gì sai?

Trả lời

2

Đối tượng đầu tiên (hoặc Select-Object v.v.) trong một đường ống xác định đầu trang cho đầu ra bất kể đầu ra của tệp hoặc bảng điều khiển.

Điều bạn có thể làm là chuyển đổi chúng thành csv thành hai vòng và thêm nó vào cùng một tệp. Ví dụ:

$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 

Bạn cũng có thể kết hợp chúng như thế này:

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

Kể từ khi ông muốn gõ thông tin có mặt trong CSV, tốt hơn không bao gồm các 'cờ NoTypeInformation'. – Vesper

+0

Anh ấy không. Đọc lại –

+1

Hmm. Ông nói: "Tôi mong muốn đầu ra sau:" và đầu ra chứa hàng thông tin kiểu, bắt đầu từ 'RecordID'. Vui lòng kiểm tra khối mã cuối cùng trong câu hỏi. – Vesper

Các vấn đề liên quan