【问题标题】:CSV Dynamic Unique ColumnsCSV 动态唯一列
【发布时间】: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


【解决方案1】:

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

$csv = Import-Csv 'C:\path\to\your.csv' -Delimiter ';'

$PlayGolf       = $csv | Select-Object -Expand 'PlayGolf'
$PlayGolfUnique = $PlayGolf | Select-Object -Unique

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

$csv = Import-Csv 'C:\path\to\your.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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多