如何将csv行添加到Powershell中的数组

时间:2019-03-01 22:37:45

标签: powershell

我要导入一个csv文件。取第一行(带有标题)并将其添加到powershell中的数组中。 $csv = Import-CSV "test.csv" $array = @()

2 个答案:

答案 0 :(得分:1)

当import-csv为您提供 System.Object 实例的不错的枚举数组时,您是否需要对数组的显式转换?

当您使用 import-csv 时,PowerShell将读取标题行并为您提供一系列自定义对象。每个对象都将具有与“标题”列匹配的属性。

test.csv示例

Id,FirstName
1,Name001
2,Name002

导入csv后的结果

您可以如下所示遍历集合

$csv = Import-CSV "test.csv"
foreach($item in $csv)
{
    $msg=("Id={0}  , Name={1}" -f $item.Id, $item.FirstName)
    Write-Host $msg
}
#Add the first item to your own array
$arrMy=@()
$arrMy+=$csv[0]
$arrMy

输出

Id=1  , Name=Name001
Id=2  , Name=Name002


Id FirstName
-- ---------
1  Name001  

MSDN

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/import-csv?view=powershell-6

深入了解-import-csv实际返回什么?

它返回带有N个对象的数组,这些对象的类型为 System.Management.Automation.PSCustomObject 。这里N = CSV文件中没有行。

答案 1 :(得分:0)

我不太确定您在这里要问什么,但是在我看来,您希望将CSV文件的标头作为数组获取:(第一行(带有标头)并将其添加到powershell中的数组

如果是这种情况,下面的一个小函数可以为您做到这一点:

function Get-CsvHeaders {
    # returns an array with the names of the headers in a csv file in the correct order
    [CmdletBinding(DefaultParameterSetName = 'ByDelimiter')]
    param(
        [Parameter(ValueFromPipeline = $true, Mandatory = $true, Position = 0)]
        [ValidateScript({Test-Path -Path $_ -PathType Leaf})]
        [string]$Path,

        [Parameter(Mandatory = $false)]
        [ValidateSet ('ASCII', 'BigEndianUnicode', 'Default', 'OEM', 'Unicode', 'UTF32', 'UTF7', 'UTF8')]
        [string]$Encoding = $null,

        [Parameter(Mandatory = $false, ParameterSetName = 'ByDelimiter')]
        [char]$Delimiter = ',',

        [Parameter(Mandatory = $false, ParameterSetName = 'ByCulture')]
        [switch]$UseCulture
    )
    $splatParams = @{ 'Path' = $Path }
    switch ($PSCmdlet.ParameterSetName) {
        'ByDelimiter' { $splatParams.Delimiter  = $Delimiter; break }
        'ByCulture'   { $splatParams.UseCulture = $true; break }
    }
    if ($Encoding)    { $splatParams.Encoding = $Encoding }

    $data = Import-Csv @splatParams -ErrorAction SilentlyContinue
    $data[0].PSObject.properties.name
}

用法:

$headersArray = Get-CsvHeaders -Path 'test.csv'