我有一個 CSV 檔案,我想遍歷每一行并在匹配時更改一個值。但是我沒有正確匹配。
在第 4 列中,日期如上所示“ FY22:M01 ”每個月都會改變。我相信我的語法在表示我試圖選擇的 CSV 欄位時存在問題。
所以我的問題如下:
有人可以查看這個并告訴我為什么我在第一個“ If ”陳述句上匹配錯誤,而不是在“ elseif ”陳述句上匹配嗎?我相信這與 IF 和括號有關。
然后我如何獲取該變數并根據它包含的值替換它的值?(正確匹配后我會使用什么命令)?
資料示例如下(包括標題行)
Invoice Number,Customer AdSeq,Date-Loaded,Consumption Period,Usage Year,Usage Quarter,Usage Month, Service, Units, Job Number,Description,Environment,Exception Tag (Binary yes/no),Attribute 1,Attribute 2,Attribute 3,Attribute 4,Attribute 5,Attribute 6,Attribute 7,Attribute 8,Attribute 9,Attribute 10,Attribute 11,Attribute 12,Attribute 13,Approved Rate Amount, Charge Amount (Units x Approved Rate)
22DS00009,ABC01-001,,FY22: M01,,,,Backup
22DS00009,ABC01-001,,FY22: M01,,,,Backup
22DS00009,ABC01-001,,FY22: M01,,,,Backup
22DS00009,ABC01-001,,FY22: M01,,,,Backup
22DS00009,ABC01-001,,FY22: M01,,,,Backup
22DS00009,ABC01-001,,FY22: M01,,,,Backup
22DS00009,ABC01-001,,FY22: M01,,,,Backup
22DS00009,ABC01-001,,FY22: M01,,,,Backup
22DS00009,ABC01-001,,FY22: M01,,,,Backup
22DS00009,ABC01-001,,FY22: M01,,,,Backup
我試圖在“消費期”中匹配的欄位
$userobjects = Import-Csv C:\FileLocation
$counter=0
foreach ($i in $userobjects)
{
echo $userobjects[$counter].'Comsumption Period'
If ($userobjects[$counter].'Consumption Period' = 'FY22: BLAH')
#{}
#{echo "If I see this its not working"}
{echo $userobjects[$counter].'Consumption Period'}
elseif ($userobjects[$counter].'Consumption Period' = 'FY22: M01')
#{}
#{echo "working"}
{echo $userobjects[$counter].'Consumption Period'}
$counter=$counter 1
#echo $counter
uj5u.com熱心網友回復:
在 PowerShell 中,所有比較運算子都具有-<operatorShortName>. =另一方面,由 描述的運算子僅用于賦值。
要測驗兩個值之間的相等性,您將使用-eq運算子:
if($userobjects[$counter].'Consumption Period' -eq 'FY22: BLAH') { <# ... #> }
請注意,字串比較默認為不區分大小寫,因此"A" -eq "a"被認為$true- 要執行明確區分大小寫的比較,請使用-ceq(" c ase-sensitive eq"):
if($userobjects[$counter].'Consumption Period' -ceq 'FY22: BLAH') { <# ... #> }
然后我如何獲取該變數并根據它包含的值替換它的值?(正確匹配后我會使用什么命令)?
現在,這=實際上是適合使用的運算子!
if($userobjects[$counter].'Consumption Period' -ceq 'FY22: BLAH') {
# data is corrupt, better replace it with a warning label
$userobjects[$counter].'Consumption Period' = "<unkown or invalid period specified>"
}
如果您的目標是檢測/糾正給定欄位不符合預期格式的任何行,請翻轉腳本并從描述正確值的外觀開始:
if($userobjects[$counter].'Consumption Period' -match '^FY[0-9]{2}: M(0[1-9]|1[012])$'){
# all is good!
}
else {
# invalid format encountered - correct it here
}
在這里,我使用-match正則運算式比較運算子來測驗在每個 CSV 記錄中找到的值是否與模式匹配:^FY[0-9]{2}: M(0[1-9]|1[012])$,這反過來描述了:
^ # Start of string
FY # the literal string "FY"
[0-9]{2}: # two decimal digits, followed by a literal colon
M # the literal string "M"
(?: # start non-capturing group construct
0[1-9] # match a 0 followed by one of digits 1 through 9
| # OR
1[012] # match a 1 followed by one of digits 0, 1, or 2
) # close non-capturing group construct
$ # end of string
要以給定格式獲取當前年/月,請使用Get-Date -Format:
$newLabelCurrentMonth = Get-Date -Format '\F\Yyy: \MMM'
然后分配給匹配記錄上的相應屬性:
if($userobjects[$counter].'Consumption Period' -match '^FY[0-9]{2}: M(0[1-9]|1[012])$'){
# all is good!
}
else {
# invalid format encountered - correct it here
$userobjects[$counter].'Consumption Period' = $newLabelCurrentMonth
}
最后,由于我們一直在直接修改原始集合中的物件,只需再次將其匯出為 CSV,更改應該很明顯:
$userobjects |Export-Csv .\path\to\output_file.csv -NoTypeInformation
有關 PowerShell 中的本機運算子的詳細資訊,請參閱about_Operators和about_Comparison_Operators幫助主題
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/409996.html
標籤:
上一篇:awkBEGIN在不覆寫現有檔案資料的情況下向.txt插入新列,包括新列標題并轉換為csv
下一篇:將列印輸出保存在csv檔案中
