【问题标题】:Out-GridView is showing a blank column where there is actual dataOut-GridView 显示一个空白列,其中有实际数据
【发布时间】:2018-06-18 15:42:49
【问题描述】:

我有这个 CSV 文件。

实际的 CSV 数据用“;”分隔,像这样:

[2017-04-27 15:45:04] ;x;/x;Succes;

您可以看到有一个“Terminaison”列,其中包含成功或失败信息。我的目标是在 Gridview 中显示文件的所有列。

我在做:

import-csv "C:\x\Journal\Capsule\CapsulePoste.csv" -Delimiter ";"

并获得包含正确数据的所有列的所需输出:

现在我的问题是:当我想在 GridView 中显示所有内容时,“terminaison”列全为空?为什么?所有其他列都正确显示...

import-csv "C:\x\Journal\Capsule\CapsulePoste.csv" -Delimiter ";" | out-gridview

我发现标题末尾的空格(csv 文件的第一行)导致了这个...

Date;Trousse;Version;Demandeur;Action;Paramètres;Terminaison 

(“Terminaison”后面有一个空格)

如果我在记事本中编辑 csv 并删除该空格,宾果游戏,它可以工作。但是,这并不能解决我的问题,因为我不想事先编辑文件。这个奇怪的限制是什么?有解决方法吗?


编辑:

下面提供的答案很棒。我最终使用了另一个我认为值得增加可能性的选项:

$content = Get-Content C:\x\Journal\Capsule\CapsulePoste.csv 
$content | Foreach {$_.TrimEnd()} | Set-Content C:\x\Journal\Capsule\CapsulePoste.csv
import-csv "C:\x\Journal\Capsule\CapsulePoste.csv" -Delimiter ";"| sort-object Date -descending

【问题讨论】:

标签: powershell import-csv


【解决方案1】:

正如我在 cmets 中提到的,当属性的开头或结尾有空格或特殊字符时,有一个 bug in Out-GridView 会显示空白值。我不知道空白错误的修复方法,但您可以在从 csv 转换之前修复文件,如下所示:

(Get-Content "C:\X\Capsule\CapsulePoste.csv") -replace 'Terminaison ','Terminaison' |
    ConvertFrom-CSV -Delimiter ";" |
    Out-GridView

注意:正如马特和马克所说,马克的回答更笼统。此快速修复假设Terminaison 是要修复的标题,并且在文档中的其他位置找不到。

【讨论】:

  • 你需要小心这样的建议,以防Terminaison 出现在其他地方。这种情况不太可能,但肯定有可能。我会选择只更改第一行以确保。
【解决方案2】:

这是在您导入 CSV 后修复它的通用方法:

$CSV = import-csv "C:\x\Capsule\CapsulePoste.csv" -Delimiter ";"

$FixedObject = $CSV | ForEach-Object {
    $NewObject = New-Object -TypeName PSCustomObject
    $_.PSObject.Properties | ForEach-Object { $NewObject | Add-Member -Name $_.Name.Trim() -Value $_.Value -MemberType $_.MemberType }

    $NewObject
}

$FixedObject | Out-GridView

这会遍历每个结果对象的属性,然后创建一个具有相同属性的新对象,但在每个对象的名称上运行 .Trim() 方法以删除任何周围的空白。

这显然比在导入之前修复 CSV 文件效率低,但是如果您不能确定标题行出现在 CSV 中的哪个位置(因为它并不总是第一个),这样做(通常)也可能很棘手.

当然,如果你只是想解决这个特定的场景,另一种答案是最简单的。

【讨论】:

  • 那里的技术很好,但问题是当您超出网格视图时,您最终只会在网格中得到一个结果。我可能需要构建某种哈希表来添加它们,因为它可能在 for-each 期间循环?
  • 啊,是的,糟糕的测试,我们只需要组合对象输出。我会解决的。
  • 现在应该导出所有行。你也可以不做$FixedObject = ,而是把| Out-GridView放在ForEach-Object的末尾。
  • 啊,我应该亲眼看到区别!对 powershell 来说还是新手,所以我有时会想念这些明显的东西。感谢您的帮助,选择此作为最佳答案。考虑到文件不是太大,它足够有效。非常感谢
  • 理论上它应该是一个日期对象,如果它开始的话。是否在没有自定义对象修复的情况下按日期排序?我的猜测是因为它们周围的方括号 PowerShell 将它们视为字符串。
猜你喜欢
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多