【问题标题】:Exlude a row on Import-Csv在 Import-Csv 上排除一行
【发布时间】:2019-03-20 16:17:11
【问题描述】:

我有一个关于 PowerShell 中的 Import-Csv 的问题。 我的脚本读取我目录中的所有 *.csv 文件并将其写入我的 MS SQL 数据库。到目前为止一切顺利,但我在这些 csv 文件中有问题。它们看起来都像这样:

标头 1;标头 2;标头 3 -----;-----;----- 数据1;数据2;数据3 数据1;数据2;数据3

等等。

我的代码如下所示:

foreach ($File in (Get-ChildItem -Path 'C:\data\*.csv')) {
    Import-Csv $File -Delim ';' | ForEach-Object {
        Invoke-Sqlcmd -Database $SQLDatabase -ServerInstance $SQLInstance -Query "insert into dbo.customer_data VALUES ('$($_."Instance Name"............)'

如果我删除带有“---”的行,效果很好,因为 PowerShell 无法将其转换为整数。

问题:在使用Import-Csv 时是否有忽略一行的解决方案?我发现我可以使用Get-Content 跳过行,但似乎这只能跳过行列表而不是特定行。我还考虑过在没有此行的情况下导出 csv 文件:

foreach ($File in (Get-ChildItem -Path 'C:\data\*.csv')) {
    Import-Csv $File -Delim ';' |
        where {$_."Instance Name" -ne "-------------"} |
        Export-Csv "C:\data\BaseName.csv" -NoTypeInfo

但我认为这不是一个好的解决方案,因为文件现在翻了一番,而且我对 PowerShell 中的名称占位符一无所知。或者我可以实际获取 csv 文件的当前名称并覆盖它吗?

【问题讨论】:

    标签: powershell csv


    【解决方案1】:

    您不能让 cmdlet Import-Csv 跳过特定的行,但您还有其他几个选项:

    1. 过滤掉 before 从 CSV 转换的行:

      Get-Content $file | where { $_ -notmatch "--" } | ConvertFrom-Csv -Delim ";"
      
    2. 在导入 CSV 之后过滤掉项目

      Import-Csv $file -Delim ";" | where { $_ -notmatch "--" }
      
    3. 由@AnsgarWiechers 提出(在导入后 跳过第一项):

      Import-Csv $file -Delim ";" | select -Skip 1
      

    【讨论】:

    • 我会增强正则表达式以匹配可能的引用字符串 ` $_ -notmatch '"?-{2,}"?'` 或 ` $_ -notmatch '^["\-; ]+$'` 在第一个变体中。
    • 使用这种特殊的数据格式,他们可以简单地跳过导入数据的第一行 (Import-Csv | Select -Skip 1)。但是,该问题的正确解决方案是修复 CSV 创建。
    • @AnsgarWiechers 一个人可能并不总是能够控制 CSV 的创建。你是对的,在这种情况下select -skip 1 会起作用,我也喜欢这个解决方案。我只是想展示过滤前后的并行性。还有很多其他的解决方案。
    • 我意识到从源头解决问题并不总是可行的,但它仍然是最好的解决方案。
    猜你喜欢
    • 2012-08-29
    • 1970-01-01
    • 2014-09-27
    • 2018-12-09
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    相关资源
    最近更新 更多