我可以使用以下代码将
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"
我究竟做错了什么?
解决方法
管道中的第一个对象(或Select-Object等)定义输出的标头,无论它是文件还是控制台输出.
您可以做的是在两轮中将它们转换为csv并将其添加到同一文件中.例如:
$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
你也可以像这样组合它们:
$inputFile.Transaction.TXNHEAD,$x.Transaction.TXNDETAIL | ForEach-Object { $_ | ConvertTo-Csv -NoTypeinformation -Delimiter ";" } | Set-Content -Path "c:\pstest\test.csv" -Encoding UTF8
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。