【问题标题】:Possible to use Import-CSV cmd without defining specific filename?可以在不定义特定文件名的情况下使用 Import-CSV cmd 吗?
【发布时间】:2017-12-03 02:34:15
【问题描述】:

因此,在我当前的情况下,我将 .csv 文件移动到我想要执行脚本以解析 .csv、删除特定数据并仅使用提取的数据创建新文件的位置。

我的代码很好,一切都按我的意愿工作。

但是,现在我在使用生产中的数据文件时正在运行另一组 UAT。这些 .csv 文件每天都会提供给我们,并带有日期戳。

我最初使用 text.csv 编写脚本,并希望按计划自动执行此脚本。但是现在看起来我每次都需要定义 csv 文件?这是不可行的。

是否可以使用 import-csv cmdlet 让它只加载它在文件夹中看到的 csv 文件?

这是我的代码

Import-Csv "\\pg-app05\Micros\Scripted Data Extraction\Sales\" |Where 
{$_.SITEID -like "7*"} | Select 
SITEID,DATE,REVENUECENTER,OVERGROUP,UNITS,PRICE,NETT,VATRATE,VAT,GROSS | 
ConvertTo-CSV -NoTypeInformation | % {$_ -replace '"',""} |Out-File "\\pg-
app05\Micros\Scripted Data Extraction\Sales\sales_$(get-date -f 
yyyy_MM_dd)_NI.csv" -fo -en ascii

即使文件夹中只有一个 CSV 文件,这也会返回错误。 SALES_27062017_090019.csv

这里应该只存在一个文件,所以想知道是否有可能让 powershell 只加载 csv 文件,而不管定义的文件名是什么?

我试过了

Import-Csv "\\pg-app05\Micros\Scripted Data Extraction\Sales\*.csv"

虽然它给了我一个生成的输出文件,但里面什么都没有。

【问题讨论】:

    标签: powershell csv import


    【解决方案1】:

    感谢大家的回复,感谢帮助。

    所以这是我最终实现的目标

    (Get-ChildItem "\\pg-app05\Micros\Scripted Data 
    Extraction\Sales\*.csv").FullName | Import-Csv |Where {$_.SITEID -like "7*"} 
    | Select 
    SITEID,DATE,REVENUECENTER,OVERGROUP,UNITS,PRICE,NETT,VATRATE,VAT,GROSS | 
    ConvertTo-CSV -NoTypeInformation | % {$_ -replace '"',""} |Out-File "\\pg-
    app05\Micros\Scripted Data Extraction\Sales\sales_$(get-date -f 
    yyyy_MM_dd)_NI.csv" -fo -en ascii
    

    我现在得到一个生成的输出文件,其中包含我需要的已解析数据。继续进行更多测试!

    【讨论】:

      【解决方案2】:

      Import-CSV可以,其实可以处理从多个 CSV 导入,但是没有任何通配符处理。因此,您需要以其他方式生成 CSV 列表(可能仅包含一个 CSV):

      Import-CSV ((Get-ChildItem -Path "\\pg-app05\Micros\Scripted Data Extraction\Sales\*.csv").FullName)
      

      应该像@MarkWragg 提出的解决方案一样工作

      【讨论】:

      • 我修改了我的答案,明确地提取了FullName 属性,因为当我测试它时,它不知道是将它绑定到 Path 还是 LiteralPath。您的解决方案可以说更好,因为它使 -Path 的参数显式(至少按位置)。
      • 默认是将字符串作为-Path传递给Get-ChildItem,这很好,因为我相信使用-LiteralPath也可以防止通配符的扩展。您对$_.FullName 提出了一个很好的观点,因为无法保证脚本运行在与 CSV 所在的目录相同的目录中。我已经修改了我的答案以适应这一点。
      • 感谢 Jeff,您的解决方案与 Marks 完美配合。
      【解决方案3】:

      我认为你可以这样做:

      (Get-ChildItem "\\pg-app05\Micros\Scripted Data Extraction\Sales\*.csv").FullName | Import-Csv
      

      因为Get-ChildItem-Path 参数接受通配符参数。

      您的尝试:

      Import-Csv "\\pg-app05\Micros\Scripted Data Extraction\Sales\*.csv"
      

      不起作用,因为Import-CSV-Path 参数不接受通配符。

      如果您想确保只返回 1 个 CSV,您可以这样做:

      (Get-ChildItem "\\pg-app05\Micros\Scripted Data Extraction\Sales\*.csv" | Select -First 1).FullName | Import-Csv
      

      【讨论】:

      • 这个网站是不断给予的礼物。感谢一百万马克,完美运行。
      • 很确定 Import-CSV 通过参数绑定值,因此 GCI -Path $path | Import-CSV 可以和 GCI -Path $path | Select -First 1 | Import-CSV 一样工作
      • get-childitem -path *.csv | Import-CSV 返回: Import-CSV :您必须指定 -Path 或 -LiteralPath 参数,但不能同时指定两者。
      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 2021-07-09
      • 1970-01-01
      • 2012-10-21
      • 2012-09-27
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      相关资源
      最近更新 更多