在Powershell中将CSV转换为XML

在Powershell中将CSV转换为XML,xml,powershell,csv,Xml,Powershell,Csv,我正在尝试将CSV文档转换为XML文档,以便导入到目录中。 CSV的格式如下所示: Firstname,Lastname,Email,Phone,Room,ID Bob,Smith,Bobs@email.com,1111,Suite 101,1 John,Doe,John@email.com,2222,Suite 102,2 <?xml version="1.0" encoding="UTF-8"?> <TSP version="1.1"> <co

我正在尝试将CSV文档转换为XML文档,以便导入到目录中。 CSV的格式如下所示:

 Firstname,Lastname,Email,Phone,Room,ID
 Bob,Smith,Bobs@email.com,1111,Suite 101,1
 John,Doe,John@email.com,2222,Suite 102,2

<?xml version="1.0" encoding="UTF-8"?>
<TSP version="1.1">
    <contact firstname="Bob" lastname="Smith" email="Bobs@email.com" Phone="1111" room="Suite 101" id="1"/>
    <contact firstname="John" lastname="Doe" email="John@email.com" phone="2222" room="Suite 102" id="2"/>
</TSP>
所需的XML输出需要如下所示:

 Firstname,Lastname,Email,Phone,Room,ID
 Bob,Smith,Bobs@email.com,1111,Suite 101,1
 John,Doe,John@email.com,2222,Suite 102,2

<?xml version="1.0" encoding="UTF-8"?>
<TSP version="1.1">
    <contact firstname="Bob" lastname="Smith" email="Bobs@email.com" Phone="1111" room="Suite 101" id="1"/>
    <contact firstname="John" lastname="Doe" email="John@email.com" phone="2222" room="Suite 102" id="2"/>
</TSP>

使用这篇文章中的信息,我能够获得以下输出,该输出很接近,但缺少一些绑定:

<contact Firstname ="Bob" Lastname= "Smith Email= "Bobs@email.com Phone= "1111" Room= "Suite 101" Phone= "1111" />
<contact Firstname ="John" Lastname= "Doe Email= "John@email.com Phone= "2222" Room= "Suite 102" Phone= "2222" />

非常感谢您的帮助

使用的脚本:

$docTemplate = @'
<contact $($contacts -join "`n") />
'@
$entryTemplate = @'
Firstname ="$($Phone.Firstname)" Lastname= "$($Phone.Lastname) Email= "$($Phone.Email) Phone= "$($Phone.Phone)" Room= "$($Phone.Room)" Phone= "$($Phone.Phone)"
'@

Import-Csv Test.csv -Delimiter ',' | Group-Object Id -ov grp | ForEach-Object {
  $contacts = foreach ($Phone in $_.Group) {
    $ExecutionContext.InvokeCommand.ExpandString($entryTemplate)  
  }
 $ExecutionContext.InvokeCommand.ExpandString($docTemplate) } | 
  Set-Content -LiteralPath file.xml
$docTemplate=@'
'@
$entryTemplate=@'
Firstname=“$($Phone.Firstname)”Lastname=“$($Phone.Lastname)Email=“$($Phone.Email)Phone=“$($Phone.Phone)”Room=“$($Phone.Room)”Phone=“$($Phone.Phone)”
'@
导入Csv Test.Csv-分隔符','|组对象Id-ov grp | ForEach对象{
$contacts=foreach($\组中的电话){
$ExecutionContext.InvokeCommand.ExpandString($entryTemplate)
}
$ExecutionContext.InvokeCommand.ExpandString($docTemplate)}
设置内容-LiteralPath file.xml
伊恩

本节中有很多内容使得故障排除和测试变得困难

导入Csv Test.Csv-分隔符','|组对象Id-ov grp | ForEach对象{ $contacts=

建议将其分为单独的语句,中间有打印语句。目标是找出问题是否与 1.导入CV 2.组对象 3.展开entryTemplate或相应的模板 4.展开docTemplate.或相应的模板


基于输出中引号问题的另一个想法是需要转义引号之类的特殊字符。我没有做太多我是PowerShell,但在特殊字符之前使用反斜杠是告诉解析器希望引号被视为引号字符而不是定义字符串的指令的一种方式。

您需要这样做吗d要编辑模板,请a)删除
=
和属性值开头之间的空格(例如,
Phone=“$($Phone.Phone)”
应为
Phone=“$($Phone.Phone)”
,b)为
ID
添加一个绑定,这是您从模板中删除的,就像其他人演示的那样。嗨,Ken,谢谢您的回答,我现在确实看到我在那里留下了一个空间。我已经在我的脚本中修复了这个问题。至于ID绑定,我不确定您引用的是什么。我不需要我的XML来显示UserID。脚本需要转换CSV转换成一个XML,看起来与期望的结果完全一样,带有XML版本信息和TSP绑定,我无法在用户信息之外写入。如果我将其添加到当前模板中,它会为每个用户复制它,我相信这与foreach($Phone in$\ Group)有关,但我对每个/foreach对象都不太熟悉。你说得到的以下输出很接近,但缺少一些绑定,我能看到的唯一缺少的绑定是,正如我前面提到的,oyu忘记绑定
ID
。如果你有其他问题,从你的帖子中不清楚。