我需要导入大量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
}