管道文件时,Import-CSV返回null

时间:2013-08-15 14:21:44

标签: powershell csv

我有一段代码可以从目录中获取所有.CSV文件并使用管道字符分隔符导入它们。

$apeasy = dir .\APEasy\*.csv | Import-CSV -delimiter '|'

问题是这返回null。无论我做什么,都无一例外。 奇怪的是,这有效:

dir .\APEasy\*.csv

它返回一个FileInfo对象,该对象应该作为要导入的文件通过管道传输到Import-CSV。另外,这两个命令有效:

$csvFiles = dir .\Processed_Data_Review -Filter *.txt | Import-CSV -header(1..19) -delimiter "$([char]0x7C)"
dir .\LIMS -Filter *.csv | Import-CSV | ? {$_.SampleName -like "????-*"}| Export-CSV -Path .\lims_output.txt -NoTypeInformation

我真的不知道这里发生了什么。我正在处理一个基本的管道分隔文件,引用每个字段(这很好,我可以导入数据)。这里没什么特别的。文件是THERE,导入CSV只是因为某种原因没有获得它。

所以我的问题是:什么可能导致'dir'抓取的文件无法通过管道传输到Import-CSV?

编辑:这样做的总体目标是在不知道名字的情况下读取目录中的CSV文件,并将特定列输出到各种输出文件中。

编辑:这是现在的代码行:

$apeasy = Get-ChildItem .\APEasy\*.csv | Select-Object -ExpandProperty FullName | Import-CSV -delimiter "$([char]0x7C)"

隔离Get-ChildItem语句,隔离Get-Child和Select-Object都返回它们应该的内容。目录中的csv文件列表,以及它们的完整路径数组。然而,当他们通过管道输入Import-CSV时,它们会消失。变量的Get-Member返回它是空的。

3 个答案:

答案 0 :(得分:1)

Import-Csv只接受来自管道的字符串(路径),因此为了直接管道,你需要先扩展路径:

dir .\APEasy\*.csv | 
select -expand fullname |
Import-CSV -delimiter '|'

答案 1 :(得分:1)

虽然像Get-Content这样的cmdlet可以这样工作,但是他们可以通过属性名称接受Path参数(并且LiteralPath按值接受,这是有道理的),Import-Csv是有点不一致。它只接受按值导入的路径:

-Path <String[]>
    Specifies the path to the CSV file to import. You can also pipe a path to Import-Csv.

    Required?                    false
    Position?                    1
    Default value                None
    Accept pipeline input?       true (ByValue)
    Accept wildcard characters?  false

所以你可以使用

Get-ChildItem ... | Select-Object -ExpandProperty FullName | Import-Csv

但它不会直接在管道外工作。

答案 2 :(得分:0)

这是一个 known bug in Import-Csv - 即使您应该能够直接管道Get-ChildItem(又名dir)输出Import-Csv,自Windows PowerShell v5.1 / PowerShell Core v6.0.2 起仍然存在

输出文件&#39; .PSPath属性值是一种解决问题的方法.FullName也适用):输入对象&#39; .PSPath属性是 绑定到Import-Csv的{​​{1}}参数的内容,但目前还不是。

由于您无论如何都要收集内存中的所有输入,您只需使用member enumeration(PSv3 +)访问所有匹配文件的-LiteralPath属性:

.PSPath