CSV 动态唯一列



我需要导入大量CSV文件,根据标题行值动态创建变量名称,将列值分配给列数组,将唯一列值分配给唯一列数组。

ID;打高尔夫球;日;温度;展望;湿度;风;1;否;05-7月;炎热;晴朗;高;假;2;无;06-7月;炎热;晴;高;真;3;是;07-7月;热;阴;高;假;4;是;09-7月;凉爽;雨;正常;假;5;是;7月10日;凉爽;阴天;正常;真;6;否;7月12日;温和;晴天;高;假;7;是;14-7月;凉爽;晴天;正常;假;8;是;15-7月;温和;雨;正常;假;9;是;7月20日;轻度;晴天;正常;真;10;是;7月21日;轻度;阴天;高;真;11;是;7月22日;炎热;阴天;正常;假;

例如,在上面的 CSV 文件中,我会创建 $ID$PlayGolf 等等。数组$PlayGolf将包含值@("no", "no", "yes", "yes",..."yes"),数组$PlayGolfUnique将包含值@("no", "yes")

以下片段概述了我在解决方案方面走了多远:

Param(
    [Parameter(Position = 0, HelpMessage = "Input data: (e.g. Input.csv")]
    [string]$inputFile = "Input.csv",
    [Parameter(Position = 2, HelpMessage = "Data delimiter: (e.g. ;")]
    [string]$dataDelimiter = ";"
)
$main = {
    Begin {
        Write-Host "SO Question Begin..." -ForegroundColor Black -BackgroundColor Green
    }
    Process {
        try {
            $line = (Get-Content $inputFile -TotalCount 2)[0]
            $delimiterCount = ([char[]]$line -eq $dataDelimiter).Count
            $colHeaders = @(((Get-Content $inputFile)[0..($delimiterCount - 1)] -split ($dataDelimiter))[0..($delimiterCount - 1)])
        } catch {
            Write-Host "Error: $($_.Exception)" -ForegroundColor White -BackgroundColor Red
            Break
        }
    }
    End {
        if ($?) {
            Write-Host "Completed Successfully." -ForegroundColor Black -BackgroundColor Green
            Write-Host "SO Question End..." -ForegroundColor Black -BackgroundColor Green
        }
    }
}
& $main

不要试图重新发明轮子。导入 CSV,将相关列的值选择到一个变量中,然后从该变量中获取唯一值并将其分配给另一个变量。

$csv = Import-Csv 'C:pathtoyour.csv' -Delimiter ';'
$PlayGolf       = $csv | Select-Object -Expand 'PlayGolf'
$PlayGolfUnique = $PlayGolf | Select-Object -Unique

如果您想在不知道列数和/或标题名称的情况下对所有列执行此操作,我建议使用哈希表而不是单个变量:

$csv = Import-Csv 'C:pathtoyour.csv' -Delimiter ';'
$ht = @{}
$csv[0].PSObject.Properties | ForEach-Object {
    $col = $_.Name
    $ht[$col] = $csv | Select-Object -Expand $col
    $ht["${col}_Unique"] = $csv | Select-Object -Expand $col -Unique
}

最新更新