为什么Powershell Import-Csv无法在此CSV文件上正常工作?

Tod*_*lch 2 csv import powershell import-csv

我正在将此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
Run Code Online (Sandbox Code Playgroud)

Powershell代码:

$computerscsv = import-csv -Path "C:\C Drives Less than 10GB free.csv" #import the csv file
$computerscsv | Format-Table
pause
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激。

Bac*_*its 7

编辑:在PowerShell GitHub存储库上已报告了此问题。


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

解决方法:

$data = Get-Content "C:\C Drives Less than 10GB free.csv"
$data[0] = 'Num' + $data[0]
$data | ConvertFrom-Csv
Run Code Online (Sandbox Code Playgroud)

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

$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
Run Code Online (Sandbox Code Playgroud)

我的猜测是,Import-Csv并且ConvertFrom-Csv将以a开头的第一行误认为#是(现在已经过时)类型信息行的开头:

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"
Run Code Online (Sandbox Code Playgroud)

  • 使用包含[负前瞻](https://www.regular-expressions.info/lookaround.html)和可选的前导“”“的反向引用的单个RegEx,可能更容易地有条件地替换`#`。 >`$ data [0] = $ data [0]-替换'^(“?)#(?! TYPE)','$ 1Num#'` (2认同)