如何制作Powershell';s导入Csv正确导入空格

如何制作Powershell';s导入Csv正确导入空格,powershell,csv,Powershell,Csv,我有一个CSV文件,其中一些单元格中有空格,而其他单元格则是空的。如果我跑 " " -eq "" 它返回False,以便Powershell本身理解空格和空字符串之间的区别。但是,我有一个包含以下内容的CSV文件: Header0,Header1,Header2,Header3 FillerData, ,,FillerData 当我导入并比较它时,我得到以下结果: PS C:\> $MyCSV = Import-Csv -Path "C

我有一个CSV文件,其中一些单元格中有空格,而其他单元格则是空的。如果我跑

" " -eq ""
它返回False,以便Powershell本身理解空格和空字符串之间的区别。但是,我有一个包含以下内容的CSV文件:

Header0,Header1,Header2,Header3
FillerData, ,,FillerData
当我导入并比较它时,我得到以下结果:

PS C:\> $MyCSV = Import-Csv -Path "C:\MyCSV.csv"
PS C:\> $MyCSV.Header1 -eq " "
False

PS C:\> $MyCSV.Header1 -eq ""
True

PS C:\> $MyCSV.Header2 -eq " "
False

PS C:\> $MyCSV.Header2 -eq ""
True

因此,“导入Csv”默认情况下,当Csv条目不相等时,使用空格将其视为等于空字符串。我真的需要为我的用例导入空白空间。有没有办法让导入的CSV正确地导入空白空间而不是将它们当作空字符串来处理?< /P> < P>如果我在代码> ReXEX <代码>稍微好一点,这是可以改进的,但是这里是工作解决方案,所以基本上<代码>导入CSV < /代码>将默认地删除空的空间,除非你指定你需要一个字面空白空间。一种方法是在每个单元格上添加开头和结尾
”,但由于您的CSV没有这些,添加这些
的一种方法是:

$csv = Get-Content ./test.csv

$newCsv = $csv | ForEach-Object {
    $_ -replace '(^|$)','$0"' -replace ',','","'
} | ConvertFrom-Csv

# As you can see, this results in 1 instead of 0
PS /> $newCsv.Header1.Length
1
编辑: 实际上,不应该需要foreach对象的
。这也很好:

$newCsv = $csv -replace '(^|$|[\r\n])','$0"' -replace ',','","' | ConvertFrom-Csv
编辑2: 在下面的评论中添加示例

  • 使用
    ForEach对象
    可降低内存消耗,但效率较低:
[^,]+
匹配除
以外的任何非空字符,即任何非空字段

  • 没有每个对象的
    (最有效的解决方案):

您可以在此处以纯文本形式包含csv的一些行(包括标题)吗?我添加了一个示例,其中包含一些填充数据,以显示空格和空字符串之间的差异。如果您控制csv的生成过程,请将有意义的空格括在引号中-例如,请参阅ConvertTo csv的输出:
(新对象pscustomobject-属性([有序]@{“Header0”=“FillerData”;“Header1”=“Header2”=$null;“Header3”=“FillerData”}))|转换为csv提供
“Header0”、“Header1”、“Header2”、“Header3”“FillerData”、“、”FillerData”
-注意
“如果你的问题还没有完全回答,请考虑回答或提供反馈。当然,我认为我的95%个问题有一个被接受的答案。但是,我首先需要验证它是否有效。现在,我尝试这个问题,添加引号使进口CSV逐字导入。所以用引号包围CSV内容可以解决这个问题,很有意思。我会摆弄CSV文件和正则表达式,看看这会把我引向何方。我正在用循环导入CSV文件,所以我最好在脚本中使用它之前使用你的示例并将引号写入文件。我会回到这里!非常好的方法;您可以简化为单个
-replace
操作,如下所示:
-replace'[^,]+',“$&”
,但请注意,与您的方法一样,这依赖于没有嵌入
字符的字段。(这将要求这些字段已经被双引号引用,这里的情况似乎不是这样)。
$&
只是
$0
的别名-您可以互换使用它们。
[^,]+
只需匹配除
以外的任何非空字符运行,即任何非空字段。
ForEach对象
值得与直接
获取内容
输入一起使用,如果文件太大而无法放入内存。作为一个整体;否则,最有效的解决方案是:
(获取内容-Raw./test.csv)-替换“[^,\r\n]+“,”“$&“| ConvertFrom Csv
您提供了正确的解释和该方法的基本原理,因此我认为改进您的答案而不是发布另一个答案是有意义的。请随时使用我以前评论中的信息更新您的答案。哦,我的,当然!谢谢:)是的,有了这两种解决方案,这就行了!非常感谢!
$newCsv = $csv | ForEach-Object {
    $_ -replace '[^,]+', '"$&"'
} | ConvertFrom-Csv
$csv = (Get-Content -Raw ./test.csv) -replace  '[^,\r\n]+', '"$&"' | ConvertFrom-Csv