【发布时间】:2018-08-20 05:06:09
【问题描述】:
我需要导入多个 CSV 文件,根据标题行值动态创建变量名,将列值分配给列数组,并将唯一列值分配给唯一列数组。
ID;PlayGolf;天;温度;展望;湿度;风; 1;无;05-7 月;热;晴;高;FALSE; 2;不;06-7 月;热;晴;高;真; 3;是;07-7 月;热;阴;高;FALSE; 4;是;09-7 月;凉爽;下雨;正常;FALSE; 5;是;7 月 10 日;凉爽;阴;正常;真; 6;无;7 月 12 日;温和;晴;高;FALSE; 7;是;7 月 14 日;凉爽;晴天;正常;错误; 8;是;7 月 15 日;温和;下雨;正常;错误; 9;是;7 月 20 日;温和;晴天;正常;真; 10;是;7 月 21 日;温和;阴;高;真; 11;是;7 月 22 日;热;阴;正常;FALSE;例如,在上面的 CSV 文件中,我会创建 $ID、$PlayGolf 等等。数组$PlayGolf 将包含值@("no", "no", "yes", "yes",..."yes"),数组$PlayGolfUnique 将包含值@("no", "yes")。
以下 sn-p 概述了我在解决方案方面取得的进展:
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
【问题讨论】:
-
嗯...为什么不使用标准的 Powershell cmdlet?像这样的东西:
Import-Csv -Path C:\sample\csv.csv -Delimiter ';' -OutVariable CSV$Csv.playgolf | Select-Object -Unique -OutVariable PlayGolfUnique -
@Olaf,我需要一个通用的解决方案,它可以在不知道列数或标题名称的情况下处理 CSV 文件。
-
您可能在问题中提到了这一点。 ;-)
-
@Olaf。道歉。我错误地认为提到我需要“导入一些 CSV 文件”会传达该要求。
-
我们中的一些人不是以英语为母语的人。尽可能清晰和正确可能会有所帮助。无论如何,Ansgar 已经为您指出了正确的方向。 :-)
标签: powershell csv variables dynamic unique