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

时间:2019-03-27 17:37:46

标签: xml powershell csv

我正在尝试通过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>

所以我在某个地方愚蠢地搞砸了两件事;

  1. $data | Select-Object 'thing'给了我所有的“事物”列表,而不是遍历每个“事物”并在每个XML条目中列出了它们。给我正确的条目数量吗?
  2. 我的“项目”被列为系统对象(而不是值),尽管与其他所有项目一样。

2 个答案:

答案 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"===""))
相关问题