我有一系列文件随着时间的推移改变了一些标题命名和列数。但是,文件始终将第一列作为开始日期,将第二列作为结束日期。
我想获得这两列,但名称随着时间的推移而改变。 我试过的是:
$FileContents=Import-CSV -Path "$InputFilePath"
foreach ($line in $FileContents)
{
$StartDate=$line[0]
$EndDate=$line[1]
}
...但是$ FileContents是(我相信)一个类型(对象?)的数组,我不确定如何在PowerShell中进行位置访问。任何帮助将不胜感激。
编辑:文件从逗号分隔符切换到管道分隔符,并且有1000个文件可供使用,因此我使用Import-CSV,因为它可以隐式读取任一格式。
答案 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