2017-04-13 123 views
5

我可以通过使用下面的代码,以XML转换为CSV:PowerShell的 - 将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 

它的工作原理,如果文件只包含一个根节点有一种类型的子节点,例如:

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

输出会是这样:

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

这是伟大的。

然而,在现实中输入文件有一个“标题行”的信息时,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> 

当应用相同的代码,我得到:

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

当我想这个代码,而不是只获得头:

#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 

我得到:

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

我所试图实现的,是这样的输出:

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

我在做什么错?

回答

2

管道中的第一个对象(或Select-Object等)定义了输出的标题,而不管它是文件还是控制台输出。

你可以做的是在两轮中将它们转换为csv并将其添加到同一个文件中。例如:由于他想输入的信息存在于CSV,最好不要包括`NoTypeInformation`标志

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

$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 

你也可以像这样将它们结合起来。 – Vesper

+0

他没有。再次阅读 –

+1

嗯。他说:“我希望以下输出:”和输出包含类型信息行,从“RecordID”开始。请检查问题中的最后一个代码块。 – Vesper