【问题标题】:Replace headers on export-csv from selectable list using powershell使用 powershell 从可选列表中替换 export-csv 上的标题
【发布时间】:2016-12-26 06:45:53
【问题描述】:

对 powershell 相当陌生,我给自己带来了一些挑战,我认为这应该是可能的,我只是不确定最好的解决方法。

我们有一个用户在 csv 中有大量列(可以从 20 到 50 不等),行可以在 1 到 10,000 之间变化。数据是 ClientName、Address1、Address2、Postcode 等。(尽管这些数据可能因数据来源而有很大差异 - 外部公司)这需要使用预构建的例程导入系统,该例程会查看文件并需要数据库列标题作为 csv 标题。比如说ClientDisplay、Ad_Line1、Ad_Line2、PCode等。

我正在考虑可以从 ExternalSource.csv 读取标头的通用 powershell“映射”表单和 DatabaseHeaders.csv(或直接 sql 查询查找)将它们显示为表单中的列,然后突出显示每列中的一个和一个“链接”按钮,一旦您浏览了 ExternalSource.csv 中的所有列,一个“生成 csv”按钮,该按钮采用映射的标题并附加来自 ExternalSource.csv 的正确数据列

我是不是在尝试使用 powershell 时完全找错了树?目前这是一个非常耗时的过程,所以只是试图让用户的生活更轻松。

任何建议表示赞赏..

谢谢,

乔恩

【问题讨论】:

    标签: csv powershell


    【解决方案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 ofAddress1`的列

    可以从文件中读取列映射,您必须编写一些代码来读取文件、选择属性并创建格式。

    一个非常简单的解决方案是从另一个脚本文件中读取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。

    请参阅this blog by Scott Hansleman,了解如何将 XSLT 与 PowerShell 结合使用。

    【讨论】:

    • 谢谢 oɔɯǝɹ,我确实看过,但问题是 ExternalSource.csv 列每次都会大不相同,因此命中率会很低,因此需要更通用的东西.Xlst 模板会像硬编码一样吗?
    • @user898205 您可以使用文件创建解决方案来描述列布局,或者使用 xslt 进行映射。在这两种情况下,代码都将保持不变,因为每个映射的配置都在 config 或 xslt 文件中。具有列映射的解决方案可能更易于配置和使用,但仅限于支持列映射。 xslt 解决方案配置起来会更复杂(xslt 使用起来有点困难),但最终会提供更大的灵活性。
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2021-04-02
    • 1970-01-01
    • 2017-10-19
    相关资源
    最近更新 更多