【问题标题】:How to search imported CSV cell values for each row如何为每一行搜索导入的 CSV 单元格值
【发布时间】:2019-02-11 01:46:00
【问题描述】:

我正在尝试导入 csv,搜索每行中的单元格值(列),然后查找并计算任何空值或空白值。然后,如果计数达到 13,则执行 X。但是,当我运行此代码时,它显示单元格/列值是单个对象,而不是每列的单独值?如何搜索行中的单个单元格值?

示例代码

$DataFileLocation = "\\Server\Output.csv"
$sheet = import-csv $DataFileLocation
$count = 0
foreach ($row in $sheet) {
    foreach ($column in $row) {
        Write-Host "Searching value: $column"
        if ($column -eq $null -or " ") {
            Write-Host "Found a blank!"
            $count++
        }
    }
    $count
    if ($count -eq 13) {
        Write-Host "Found match!" -ForegroundColor Red
    }
    $count = 0
}

【问题讨论】:

    标签: powershell import-csv


    【解决方案1】:

    每个$row 都是一个PSCustomObject

    PS > $row.GetType().Name
    PSCustomObject
    

    访问底层属性值:

    foreach ($column in $row.psobject.Properties.Value){
    ...
    }
    

    检查$column 是否为$null、空白或空格:

    if ([System.String]::IsNullOrWhiteSpace($column)) { ... }
    

    【讨论】:

    • 这似乎奏效了,谢谢!但是,我确实遇到了错误“system.outofmemoryException”。可能是因为我的数据集太大了,关于如何在不拆分原始文件的情况下解决这个问题的任何想法?另一件事(加分)我如何将结果导出到 csv 并使其具有相同的格式,例如相同的列标题,然后附加每一行?
    • 忘记提及导入 csv 时发生的内存不足异常。大约 500 MB,简直是野兽。
    • 好消息,我切换到 64 位版本,解决了内存异常问题。现在只是将数据导出回 csv 格式。 =)
    • foreach 循环之前定义你的输出数组,例如$outputsheet = @() 在循环中if ($count -eq 13) {$outputsheet += $row} 在循环之后$outputsheet | Export-Csv "\\Server\Outputsheet.csv"
    【解决方案2】:

    或者类似的东西

    $DataFileLocation = "\\Server\Output.csv"
    $sheet = import-csv $DataFileLocation
    $count = 0
    foreach ($row in $sheet){
      ($row | Get-Member) | ? { $_.MemberType -eq "NoteProperty" } | % { 
        $n = $_.Name; "$n = $($row."$n")" 
      }
    }
    

    【讨论】:

    • 我投票给了@nas,但这是我在他的帖子出现之前的微弱尝试。
    猜你喜欢
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多