【发布时间】:2021-02-10 18:06:11
【问题描述】:
我需要将一个 csv 文件转换为包含 7 列的 XML:
network;server;instance;type;date;time;state
toto;titi;APPLINT1;LOG;10/02/2021;13:00:10 - During in min : 1;Succeeded
toto;titi;APPLINT1;VIDEO;12/02/2021;13:20:10 - During in min : 1;Succeeded
toto;tutu;SPTPROD1;DIFF;10/02/2021;14:30:10 - During in min : 1;Succeeded
toto;tutu;TOOL;DIFF;12/02/2021;14:00:10 - During in min : 1;Succeeded
XML 结构应如下所示:
<?xml version="1.0" encoding="utf-8"?>
<xml>
<network name='toto'>
<server name='titi'>
<instance name='APPLINT1'>
<type name='LOG'>
<date name="10/02/2021">
<time name="13:00:10 - During in min : 1">
<state name="Succeeded"></state>
</time>
<time name="14:00:10 - During in min : 1">
<state name="Succeeded"></state>
</time>
</date>
</type>
<type name='DIFF'>
<date name="10/02/2021">
<time name="13:00:10 - During in min : 1">
<state name="Succeeded"></state>
</time>
<time name="14:00:10 - During in min : 1">
<state name="Succeeded"></state>
</time>
</date>
</type>
<type name='FULL'>
<date name="10/02/2021">
<time name="13:00:10 - During in min : 1">
<state name="Succeeded"></state>
</time>
<time name="14:00:10 - During in min : 1">
<state name="Succeeded"></state>
</time>
</date>
</type>
</instance>
<instance name='VIDEO'>
<type name='LOG'>
<date name="10/02/2021">
<time name="13:00:10 - During in min : 1">
<state name="Succeeded"></state>
</time>
<time name="14:00:10 - During in min : 1">
<state name="Succeeded"></state>
</time>
</date>
</type>
</instance>
</server>
<server name='tutu'>
<instance name='SPTPROD1'>
<type name='LOG'>
<date name="10/02/2021">
<time name="13:00:10 - During in min : 1">
<state name="Succeeded"></state>
</time>
<time name="14:00:10 - During in min : 1">
<state name="Succeeded"></state>
</time>
</date>
</type>
<type name='DIFF'>
<date name="10/02/2021">
<time name="13:00:10 - During in min : 1">
<state name="Succeeded"></state>
</time>
<time name="14:00:10 - During in min : 1">
<state name="Succeeded"></state>
</time>
</date>
</type>
<type name='FULL'>
<date name="10/02/2021">
<time name="13:00:10 - During in min : 1">
<state name="Succeeded"></state>
</time>
<time name="14:00:10 - During in min : 1">
<state name="Succeeded"></state>
</time>
</date>
</type>
</instance>
<instance name='VIDEO'>
<type name='LOG'>
<date name="10/02/2021">
<time name="13:00:10 - During in min : 1">
<state name="Succeeded"></state>
</time>
<time name="14:00:10 - During in min : 1">
<state name="Succeeded"></state>
</time>
</date>
</type>
</instance>
</server>
</xml>
Powershell 脚本:
$docTemplate = @'
<xml>
<network name=$($backup.network)>
<server name=$($backup.server)>
<instance name=$($backup.instance)>
<type name=$($backup.type)>
$($backups -join "`n")
</type>
</instance>
</server>
</network>
</xml>
'@
# Per-backup template.
$entryTemplate = @'
<date name=$($backup.date)>
<time name=$($backup.time)>
<state name=$($backup.state)></state>
</time>
</date>
'@
Import-Csv backup_sql.csv -Delimiter ';' | Group-Object instance -ov grp | ForEach-Object {
$backups = foreach ($backup in $_.Group) {
$ExecutionContext.InvokeCommand.ExpandString($entryTemplate)
}
$ExecutionContext.InvokeCommand.ExpandString($docTemplate)
} | Out-File "backup_sql.xml"
其实是 XML 输出文件:
<xml>
<network name=toto>
<server name=titi>
<instance name=APPLINT1>
<type name=LOG>
<date name=10/02/2021>
<time name=13:00:10 - During in min : 1>
<state name=Succeeded></state>
</time>
</date>
<date name=10/02/2021>
<time name=13:00:10 - During in min : 1>
<state name=Succeeded></state>
</time>
</date>
</type>
</instance>
</server>
</network>
</xml>
<xml>
<network name=toto>
<server name=titi>
<instance name=SPTPROD1>
<type name=DIFF>
<date name=10/02/2021>
<time name=14:30:10 - During in min : 1>
<state name=Succeeded></state>
</time>
</date>
</type>
</instance>
</server>
</network>
</xml>
<xml>
<network name=toto>
<server name=tutu>
<instance name=TOOL>
<type name=DIFF>
<date name=10/02/2021>
<time name=14:00:10 - During in min : 1>
<state name=Succeeded></state>
</time>
</date>
</type>
</instance>
</server>
</network>
</xml>
<xml>
<network name=toto>
<server name=tutu>
<instance name=SKYPE>
<type name=LOG>
<date name=10/02/2021>
<time name=23:00:10 - During in min : 1>
<state name=Failed></state>
</time>
</date>
</type>
</instance>
</server>
</network>
</xml>
我基于以下主题:Powershell CSV to XML
但不幸的是,我无法针对不同的列进行调整。
目标是拥有不同服务器的多个 SQL 实例的不同 SQL 备份(日志、差异和完整)的状态...
提前感谢您的帮助!
【问题讨论】:
标签: xml powershell csv