我正在尝试通过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输出模板示例:
<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条目中列出了它们。给我正确的条目数量吗?答案 0 :(得分:2)
这三个陈述
typeof a[i] === "array"
为您提供仅具有一个属性的自定义对象列表。在模板中使用这些列表,每次迭代都会将 all 值插入标记中。您想要的只是当前迭代中的值,因此之前创建列表对您没有任何好处。您真正想要的是循环的每次迭代中的当前对象。
对于$xmlnames = $data | Select-Object "Name"
$xmlitems = $data | Select-Object "Item"
$xmlprice = $data | Select-Object "Purchase Price"
,由于变量$xmlitems
,$xmlnames
和$xmlitems
是数组,因此也会遇到PowerShell陷阱。在数组上使用点访问时,PowerShell会执行称为member enumeration的操作。本质上$xmlprice
不会为您提供 array 对象的属性$xmlnames.Name
的值,而是所有数组的属性Name
的值元素。
成员枚举仅在数组对象本身不具有该名称的成员的情况下起作用。这使我们回到Name
。对于该变量,您尝试获取数组元素的属性$xmlitems
的值。但是,数组对象实际上具有方法Item
,因此Item()
尝试调用该方法,而不是调用数组元素的$xmlitems.Item
属性。但是由于该方法已重载并且调用缺少括号(Item
而不是$xmlitems.Item
),因此PowerShell会向您显示方法定义。
删除$xmlitems.Item()
语句,并用"current object" variable Select-Object
替换XML片段模板中的数组变量,然后代码将执行您想要的操作。
$_
答案 1 :(得分:1)
您还可以使用“ LINQ to XML”创建xml。
df.filter(!($"col_name"===""))