2

我有一段代码应该使用管道字符分隔符从目录中获取所有 .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

我真的不知道这里发生了什么。我正在处理一个基本的管道分隔文件,每个字段的引号(这很好,我可以用这些导入数据)。这里没有什么特别的。该文件在那里,Import-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 返回它是空的。

4

3 回答 3

1

Import-Csv 仅接受来自管道的字符串(路径),因此为了直接通过管道传输到它,您需要首先扩展路径:

dir .\APEasy\*.csv | 
select -expand fullname |
Import-CSV -delimiter '|'
于 2013-08-15T14:54:53.987 回答
1

尽管 cmdlet 喜欢这样Get-Content工作,因为它们可以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

但它不会直接从管道中运行。

于 2013-08-15T14:56:10.937 回答
0

这是一个已知的错误Import-Csv- 即使您应该能够将Get-ChildItem(又名dir)输出直接传送到,但从Windows PowerShell v5.1 / PowerShell Core v6.0.2Import-Csv开始,它仍然被破坏。

输出文件的.PSPath属性值是解决问题的一种方法.FullName也可以):输入对象的.PSPath属性应该绑定到Import-Csv-LiteralPath参数,但目前不是。

由于无论如何您都在收集内存中的所有输入,因此您可以简单地使用成员枚举(PSv3+) 来访问.PSPath所有匹配文件的属性:

$apeasy = (Get-ChildItem .\APEasy\*.csv).PSPath | Import-CSV -delimiter '|'
于 2018-04-09T01:12:45.167 回答