gpt4 book ai didi

xml - 将CSV文件转换为适当的XML格式

转载 作者:行者123 更新时间:2023-12-03 01:01:34 25 4
gpt4 key购买 nike

我试图通过PowerShell将一些制表符分隔的CSV文件转换为XML,但我想尽一切办法。我100%肯定这是我所缺少的真正简单的东西,因此将不胜感激。我非常接近,但无法克服最后的障碍。

我本质上是希望此脚本遍历它所指向的制表符分隔的CSV($path),从CSV中删除每一行并将数据放入XML工作表($xmlpath)。

CSV范例:

"Name"  "Item"  "Purchase Price""Jimmy Smits"   "Egg"   "£40""Edward Price"  "KumQuat"   "£6000""Timmy Mallet"  "Bug"   "£2""Edgar Allen Poe"   "Weird" "0""2Pac Shakur"   "Eggnog"    ""

XML output template example:

<registration>
<Individual>
<Name></Name>
<Item></Item>
<Purchase Price></Purchase Price>
</Individual>
</registration>

这就是我一直在想的
$data = Import-Csv -Path $path -Delimiter "`t"

$xmlnames = $data | Select-Object "Name"
$xmlitems = $data | Select-Object "Item"
$xmlprice = $data | Select-Object "Purchase Price"

$entryTemplate = @'
<individual>
<Name>$($xmlnames.Name)</Name>
<Item>$($xmlitems.Item)</Item>
<Purchase Price>$($xmlprice."Purchase Price")</Purchase Price>
</individual>
'@

$xml = $data | ForEach-Object {
$ExecutionContext.InvokeCommand.ExpandString($entrytemplate)
}
$xml | Out-File $xmlpath

然后推出;

<Individual>
<Name>Jimmy Smits Edward Price Timmy Mallet Edgar Allen Poe 2Pac Shakur</Name>
<Item>System.Object IList.Item(int index) {get;set;}</Item>
<Purchase Price>£40 £6000 £2 0 </Purchase Price>
</Individual>

所以我在某个地方愚蠢地搞砸了两件事;
  • $data | Select-Object 'thing'是给我所有“事物”的列表,而不是遍历每个“事物”并在每个XML条目中列出一个。但是给我正确的条目数吗?
  • 我的“项”被列为系统对象(而不是值),尽管与其他所有项一样。
  • 最佳答案

    三个陈述

    $xmlnames = $data | Select-Object "Name"
    $xmlitems = $data | Select-Object "Item"
    $xmlprice = $data | Select-Object "Purchase Price"

    提供仅具有一个属性的自定义对象列表。在模板中使用这些列表会在每次迭代时将所有值插入标记中。您想要的只是当前迭代中的值,因此之前创建列表对您没有任何好处。您真正想要的是循环的每次迭代期间的当前对象。

    如果使用 $xmlitems,您也会遇到PowerShell陷阱,因为变量 $xmlnames$xmlitems$xmlprice是数组。在数组上使用点访问时,PowerShell正在执行称为 member enumeration的操作。本质上, $xmlnames.Name不会为您提供数组对象的 Name属性值,而是所有数组元素的 Name属性值。

    但是,成员枚举仅在数组对象本身没有该名称的成员时才有效。这使我们回到 $xmlitems。对于该变量,您尝试获取数组元素的属性 Item的值。但是,数组对象实际上具有方法 Item(),因此 $xmlitems.Item尝试调用该方法,而不是调用数组元素的 Item属性。但是,由于该方法已重载并且调用缺少括号( $xmlitems.Item而不是 $xmlitems.Item()),因此PowerShell会向您显示方法定义。

    删除 Select-Object语句,并用 "current object" variable $_替换XML片段模板中的数组变量,该代码将完成您想要的操作。
    $entryTemplate = @'
    <individual>
    <Name>$($_.Name)</Name>
    <Item>$($_.Item)</Item>
    <Purchase Price>$($_."Purchase Price")</Purchase Price>
    </individual>
    '@

    关于xml - 将CSV文件转换为适当的XML格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55383413/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com