使用powershell将export-csv上的标题替换为可选列表

时间:2016-08-19 07:28:55

标签: csv powershell

对PowerShell来说相当新,我给自己一些挑战,我认为应该是可能的,我只是不确定最好的解决方法。

我们的用户在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吠叫错误的树?目前这是一个非常耗时的过程,所以只是试图让用户的生活更轻松。

任何建议表示赞赏..

谢谢,

乔恩

1 个答案:

答案 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