我有一个 .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”
你误会了……很多事情。
首先,如果是 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
您可以使用正则表达式并替换所有数据。可能不是最有效的方法,但希望这会有所帮助。
# 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"