我们的用户在csv中有大量列(可以在20-50之间变化),行数可以在1到10,000之间变化。数据是ClientName,Address1,Address2,Postcode等。(虽然这些数据可能会因数据来源而异 - 外部公司)这需要使用预先构建的例程导入系统,该例程会查看文件和需求数据库列标题为csv标头。所以说ClientDisplay,Ad_Line1,Ad_Line2,PCode等。
我正在思考一个通用的powershell'映射'表单,它可以从ExternalSource.csv中读取头文件,而DatabaseHeaders.csv(或直接的sql查询查询)将它们显示为表单中的列,然后突出显示每列中的一个和一个“链接”按钮,一旦您浏览了ExternalSource.csv中的所有列,就会生成一个“生成csv”按钮,该按钮会使映射的标题附加来自ExternalSource.csv的正确数据列
我是否完全试图使用PowerShell吠叫错误的树?目前这是一个非常耗时的过程,所以只是试图让用户的生活更轻松。
任何建议表示赞赏..
谢谢,
乔恩
答案 0 :(得分:1)
您可以将Select-Object
cmdlet与动态列一起使用,将数据整形为您需要的格式。
类似的东西:
Import-Csv -Path 'source.svc' |
Select-Object Id, Name, @{ Name='Ad_Line1'; Expression={ $_.Address1 } } |
Export-Csv -Path 'target.csv'
在此示例中,代码@{ Name='Ad_Line1'; Expression={ $_.Address1 } }
是动态列,用于创建名为AD_Line1' and the value of
Address1`
可以从文件中读取列映射,您必须编写一些代码来读取文件,选择属性并创建格式。
一个非常简单的解决方案可能是从另一个脚本文件中读取Select-Object
部分,因此您可以为每次导入区分该部分。
(简单,天真,低性能)解决方案看起来像这样(未经测试的代码):
# read input file
$input = Import-Csv -Path $inputFile
# read source, target name columns from mapping file
$mappings = Import-Csv -Path $mappingFile | Select Source, Target
# apply transformations
$transformed = $input
foreach($mapping in $mappings) {
# collect the data, add an extra column for each mapping
$transformed = $transformed | Select-Object *, @{ Name = $mapping.Target; Expression = { $_.$($mapping.Source) } }
}
#export transformed data
$transformed | Export-Csv -Path $outputFile
可替换地;可以使用Import-Csv | Export-CliXml
将数据转换为XML,在Xml上应用Xslt模板以执行转换,并使用Import-CliXml | Export-Csv
将Xml对象再次保存到Csv中。
有关如何在PowerShell中使用XSLT的信息,请参阅this blog by Scott Hansleman。