【问题标题】:Why is Powershell Import-Csv not working properly on this CSV file?为什么 Powershell Import-Csv 在此 CSV 文件上无法正常工作?
【发布时间】:2019-11-02 13:28:43
【问题描述】:

我正在将此 CSV 文件导入 powershell,但它没有导入标题,也没有导入所有列。它只获得第一列,但认为没有标题。我意识到第二行是空的,但这就是软件如何使用我需要处理的数据生成 CSV 文件的方式。

CSV 文件:

#,Labels,Machine Name,System Description,IP,User Logged,Disk Free C
,,,,,,
6,"computers-PRO,Desktop,Office 2010,OS Windows 7,Update Adobe Reader",PRO-MEDASST,91-0-928,172.10.201.111,CHR\\jeniferc,6.3
7,Update Adobe Reader,RED,empty,172.10.201.5,,9.5
8,Update Adobe Reader,SIER,empty,172.10.201.5,,6.8

Powershell 代码:

$computerscsv = import-csv -Path "C:\C Drives Less than 10GB free.csv" #import the csv file
$computerscsv | Format-Table
pause

Powershell 输出:

WARNING: One or more headers were not specified. Default names starting with "H" have been used in place of any missing
 headers.

H1
--
6
7
8

任何帮助将不胜感激。

【问题讨论】:

    标签: powershell csv import import-csv


    【解决方案1】:

    对于任何寻求修复的人来说,这对我有用:

    ((Import-CSV .\VMM_GlobalSetting.csv).Where{$_.PropertyName -eq 'QFEDatabaseVersion'}).PropertyValue
    

    在应用上述内容之前我遇到了这个错误:

     Select-Object : Property "QFEDatabaseVersion" cannot be found.
    At C:\Users\blakedrumm\Desktop\VMMDataCollector\DataCollector\Functions\General-Info.ps1:789 char:81
    + ... ing.csv") | Select-Object QFEDatabaseVersion -ExpandProperty QFEDatab ...
    +                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (@{PropertyName=...opertyValue=20}:PSObject) [Select-Object], PSArgumen
       tException
        + FullyQualifiedErrorId : ExpandPropertyNotFound,Microsoft.PowerShell.Commands.SelectObjectCommand
    

    【讨论】:

      【解决方案2】:

      编辑:此问题已在the PowerShell GitHub repository 上报告。


      这似乎是命令中的错误。 CSV 文件中的标头不能以 # 开头。请注意,将第一个标头转换为 "#" 而不是 # 也不能解决问题。

      作为一种解决方法:

      $data = Get-Content "C:\C Drives Less than 10GB free.csv"
      $data[0] = 'Num' + $data[0]
      $data | ConvertFrom-Csv
      

      或者,对于更通用的解决方案:

      $data = Get-Content "C:\C Drives Less than 10GB free.csv"
      if ($data[0][0] -eq '#') {
          $data[0] = 'Num' + $data[0]
      }
      elseif ($data[0].Substring(0,2) -eq '"#') {
          $data[0] = '"Num' + $data[0].Substring(1)
      }
      $data | ConvertFrom-Csv
      

      我的猜测是 Import-CsvConvertFrom-Csv 误以为以 # 开头的第一行作为(现在有些弃用)类型信息行的开头:

      PS C:\> Get-ChildItem C:\Windows\ | Select-Object Name, LastWriteTime -First 1 | ConvertTo-Csv -NoTypeInformation:$false
      #TYPE Selected.System.IO.DirectoryInfo
      "Name","LastWriteTime"
      "addins","9/15/2018 3:33:54 AM"
      

      【讨论】:

      • 啊...关于信息行,您可能是对的。这是有道理的。我已经习惯于尝试删除它,但我忘记了。
      • @LotPings 我使用此问题作为示例报告了链接问题。
      • # 的条件替换可能更容易使用包含negative lookahead 和可选前导" 的反向引用的单个正则表达式。 => $data[0] = $data[0] -replace '^("?)#(?!TYPE)','$1Num#'
      • 是的,它是#,我能够将它从输出中删除到 CSV 文件中,然后程序运行得很好。感谢您的帮助!
      【解决方案3】:

      我不知道 确切 的推理,但看起来磅/哈希使 Import-CSV 忽略第一行。本质上,您的文件使用这些逗号作为标题,这也是错误的。您可以通过删除文件中的第一行来模拟这一点。你会得到同样的结果。符号本身不是问题,而是它是标题中的第一个字符这一事实。

      更改该字符足以使其工作。

      $file = Get-Content "C:\C Drives Less than 10GB free.csv"
      $file[0] = $file[0].Replace('#',"Num")
      $file | ConvertFrom-Csv 
      

      “Num”可能对你来说不够用,但你需要把它做成 something 其他。看看是否有更好的方法,但应该这样做。


      可选择管道到| Select-Object -Skip 1 以处理该空行,或者更安全的方法是通过| Where-Object{$_.Num} 清除没有# 的条目,以防有更多条目,或者不能保证第一行为空白。

      【讨论】:

        猜你喜欢
        • 2015-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        • 2021-04-12
        • 1970-01-01
        • 1970-01-01
        • 2013-06-10
        相关资源
        最近更新 更多