从Import-CSV行

时间:2017-08-21 19:15:25

标签: powershell

我有一系列文件随着时间的推移改变了一些标题命名和列数。但是,文件始终将第一列作为开始日期,将第二列作为结束日期。

我想获得这两列,但名称随着时间的推移而改变。 我试过的是:

 $FileContents=Import-CSV -Path "$InputFilePath" 
 foreach ($line in $FileContents)
 {
     $StartDate=$line[0]
     $EndDate=$line[1]
 }

...但是$ FileContents是(我相信)一个类型(对象?)的数组,我不确定如何在PowerShell中进行位置访问。任何帮助将不胜感激。

编辑:文件从逗号分隔符切换到管道分隔符,并且有1000个文件可供使用,因此我使用Import-CSV,因为它可以隐式读取任一格式。

6 个答案:

答案 0 :(得分:4)

您可以使用-Header参数为csv的第一列提供所需的标题名称。然后你将跳过具有旧标题的第一行。

$FileContents = Import-CSV -Path "$InputFilePath" -Header "StartDate","EndDate" | Select-Object "StartDate","EndDate" -Skip 1

foreach ($line in $FileContents) {
    $StartDate = $line.StartDate
    $EndDate = $line.EndDate
}

以下是一个例子:

Example.csv

a,b,c
1,2,3
4,5,6

Import-CSV -Path Example.csv -Header "StartDate","EndDate" | Select-Object "StartDate","EndDate" -Skip 1

StartDate EndDate
--------- -------
1         2
4         5

答案 1 :(得分:3)

如果您使用Import-Csv,PowerShell确实会为您创建一个对象。 “列”是calles 属性。您可以使用Select-Object选择属性。您必须为要选择的属性命名。由于您事先不知道属性名称,因此可以使用Get-Member获取名称。前两个属性应与CSV中的前两列匹配。

使用以下示例代码并将其应用于您的脚本:

$csv = @'
1,2,3,4,5
a,b,c,d,e
g,h,i,j,k
'@

$csv = $csv | ConvertFrom-Csv
$properties = $csv | Get-Member -MemberType NoteProperty | Select-Object -First 2 -ExpandProperty Name
$csv | Select-Object -Property $properties

答案 2 :(得分:1)

这个怎么样:

$FileContents=get-content -Path "$InputFilePath" 

for ($i=0;$i -lt $FileContents.count;$i++){
    $textrow = ($FileContents[$i]).split(",")
    $StartDate=$textrow[0]
    $EndDate=$textrow[1]

    #do what you want with the variables
    write-host $startdate
    write-host $EndDate
}

等待您引用csv文件....

答案 3 :(得分:0)

使用foreach(%= foreach的别名)和split:

的其他解决方案
Get-Content "example.csv" | select -skip 1 | %{$row=$_ -split ',', 3; [pscustomobject]@{NewCol1=$row[0];NewCol2=$row[1]}} 

答案 4 :(得分:0)

您可以像这样在select中构建谓词:

Get-Content "example.csv" | select @{N="Newcol1";E={($_ -split ',', 3)[0]}}, @{N="Newcol2";E={($_ -split ',', 3)[1]}} -skip 1

答案 5 :(得分:0)

使用convertfrom-string

Get-Content "example.csv" | ConvertFrom-Csv -Delimiter ',' -Header col1, col2 | select -skip 1