为什么 Powershell Import-Csv 无法在此 CSV 文件上正常工作?
Why is Powershell Import-Csv not working properly on this CSV file?
我正在将此 CSV 文件导入 powershell,但它没有导入 headers,也没有导入所有列。它只得到第一列,但认为没有 headers。我意识到第二行是空的,但这就是软件使用我需要处理的数据生成 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
如有任何帮助,我们将不胜感激。
我不知道 确切的 推理,但看起来 pound/hash 让 Import-CSV
忽略了第一行。实际上,您的文件使用这些逗号作为 header,这也是错误的。您可以通过删除文件中的第一行来模拟这一点。你会得到相同的结果。符号本身不是问题,而是它是 header 中的第一个字符这一事实。
改变那个角色就足以让它发挥作用。
$file = Get-Content "C:\C Drives Less than 10GB free.csv"
$file[0] = $file[0].Replace('#',"Num")
$file | ConvertFrom-Csv
"Num" 可能对您来说不够,但您需要 其他。看看是否有更好的方法,但应该这样做。
可选择通过管道传输到 | Select-Object -Skip 1
以处理该空行,或者更安全的方法是通过 | Where-Object{$_.Num}
清除没有 # 的条目,以防有更多条目或不能保证第一行是空白。
编辑:此问题已在 the PowerShell GitHub repository 上报告。
这似乎是命令中的错误。 CSV 文件中的 header 不能以 #
开头。请注意,将第一个 header 转换为 "#"
而不是 #
也不能解决问题。
解决方法:
$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-Csv
和 ConvertFrom-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"
对于任何寻求修复的人来说,这对我有用:
((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
我正在将此 CSV 文件导入 powershell,但它没有导入 headers,也没有导入所有列。它只得到第一列,但认为没有 headers。我意识到第二行是空的,但这就是软件使用我需要处理的数据生成 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
如有任何帮助,我们将不胜感激。
我不知道 确切的 推理,但看起来 pound/hash 让 Import-CSV
忽略了第一行。实际上,您的文件使用这些逗号作为 header,这也是错误的。您可以通过删除文件中的第一行来模拟这一点。你会得到相同的结果。符号本身不是问题,而是它是 header 中的第一个字符这一事实。
改变那个角色就足以让它发挥作用。
$file = Get-Content "C:\C Drives Less than 10GB free.csv"
$file[0] = $file[0].Replace('#',"Num")
$file | ConvertFrom-Csv
"Num" 可能对您来说不够,但您需要 其他。看看是否有更好的方法,但应该这样做。
可选择通过管道传输到 | Select-Object -Skip 1
以处理该空行,或者更安全的方法是通过 | Where-Object{$_.Num}
清除没有 # 的条目,以防有更多条目或不能保证第一行是空白。
编辑:此问题已在 the PowerShell GitHub repository 上报告。
这似乎是命令中的错误。 CSV 文件中的 header 不能以 #
开头。请注意,将第一个 header 转换为 "#"
而不是 #
也不能解决问题。
解决方法:
$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-Csv
和 ConvertFrom-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"
对于任何寻求修复的人来说,这对我有用:
((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