Powershell - 即使我使用 -contains 而不是 -eq,我也无法匹配 if 语句中的字符串

问题描述 投票:0回答:2

我有一个 .csv 文件,我需要根据另一个字段的值更改一个字段。 数据的重要部分是: "08-01-2023 09:00:00","08-02-2023 09:00:00","937600","奏鸣曲测量",...

我想根据前一个字段中的内容更改每行中的“SonatMeasurement”字段值。

    $data = Get-Content $AFw
    Foreach ($row in $data){
        $values = $row -split ','
        Write-Host $values[2]
        Write-host $values[3]
        if ($values[2] -contains 937600){
            $values[3] = "SNG TRUMBOWER NASSAU"
            } elseif ($values[2] -contains 937700){
                $values[3] = "SNG NORMANDY  DUVALL"
                } elseif ($values[2] -contains 960530){
                    $values[3] = "SNG JACKSONVILLE NASSAU"
                    } elseif ($values[2] -contains 960590){
                        $values[3] = "SNG BAKER NASSAU"
                        } elseif ($values[2] -contains 96108){
                            $values[3] = "WILDWOOD"
                            } elseif ($values[2] -contains 10){
                                $values[3] = "DRAINFIELD"
                                }

        $newRow = $values -join ','
        $data = $data -replace [regex]::Escape($row), $newRow

    }

我已经尝试过 -eq、-contains、所有版本的引号 ""、不带引号的 '' 等。我什至还没有到达代码的连接部分。 Write-host $value[2] 打印出“937600” Write-host $value[3] 打印出“SonatMeasurement”

powershell csv join split
2个回答
0
投票

你误会了……很多事情。

首先,如果是 CSV,只需使用

Import-Csv
。让管理一切变得更加容易。

第二,与你的问题更直接相关...

-contains
没有做你认为它会做的事。

简单来说:

$Collection -contains $Element

要检查字符串是否包含特定子字符串,需要使用
-like
-match
(这个使用正则表达式)

第三:使用

Switch()
,Dende!

# you can replace the names of the headers with whatever you want of course
$data = Import-Csv -Path $AFw -Delimiter ',' -Header FirstHeader, SecondHeader, ThirdHeader, FourthHeader #, etc etc.

$data.Foreach({
        Write-Host $_.FirstHeader
        Write-Host $_.SecondHeader


        switch ($_) {
            { $_.ThirdHeader -like '937600' } {
                $_.FourthHeader = 'SNG TRUMBOWER NASSAU' 
                break
            }
            { $_.ThirdHeader -like '937700' } {
                $_.FourthHeader = 'SNG NORMANDY  DUVALL' 
                break
            }
            { $_.ThirdHeader -like '960530' } {
                $_.FourthHeader = 'SNG JACKSONVILLE NASSAU' 
                break
            }
            { $_.ThirdHeader -like '960590' } {
                $_.FourthHeader = 'SNG BAKER NASSAU' 
                break
            }
            { $_.ThirdHeader -like '96108' } {
                $_.FourthHeader = 'WILDWOOD'
                break
            }
            { $_.ThirdHeader -like '10' } {
                $_.FourthHeader = 'DRAINFIELD' 
                break
            }
            Default {
                <# do nothing, I guess #> 
            }
        }

    })

    # $data now contains the modified values

0
投票

您可以使用正则表达式并替换所有数据。可能不是最有效的方法,但希望这会有所帮助。

# Create matching pattern
$findPattern = '"{pattern}","Sonat Measurement"'

# Create replacement pattern
$replacePattern = '"{pattern}","{newMeasurement}"'

# Create an array of replacements. if you need a bunch, get them from a file. This has two hardcoded elements.
$replacements = @(
    [PSCustomObject]@{
        value = "937600"
        newMeasurement = "SNG TRUMBOWER NASSAU"
    },
    [PSCustomObject]@{
    value = "937700"
    newMeasurement = "SNG NORMANDY DUVALL"
    }
)

# Read the data from the file.
$data = Get-Content "C:\Projects\PSTests\data.txt" -Raw

# loop through the replacement array replacing all values in the file.
foreach($replacement in $replacements)
{
    $fpattern = $findPattern.Replace("{pattern}",$replacement.value)
    $rpattern = $replacePattern.`
        Replace("{pattern}",$replacement.value). `
        Replace("{newMeasurement}",$replacement.newMeasurement)  
    $data = $data -Replace $fpattern, $rpattern
}

# put data out to a file     
$data | out-file -FilePath "C:\Projects\PSTests\newdata.txt"
© www.soinside.com 2019 - 2024. All rights reserved.