Reputation: 11
Powershell Change Field in a CSV file
The issue: When downloading transactions from my bank transfers only state "Transfer from Checking" and "Transfer to Checking" I'm trying to add some additional information to the Payee field so that my financial software will determine that the two transactions one deposit and one withdrawal is in fact one transfer transaction. Example
My Main.csv
:
DATE, CATEGORY, AMOUNT, PAYEE, ACCOUNT#
10/19/2021, Transfer Internal Account Transfer, 34.04, Transfer From Checking, 5197
10/19/2021, Food and Drink Restaurants Fast Food, -15.09, Sonic, 7029
10/21/2021, Transfer Payroll, 700.2, ACH Transaction, 8828
10/21/2021, Food and Drink, -3, POS Debit VENDING, 8828
10/21/2021, Shops Supermarkets and Groceries, -4.2, Walmart, 8828
10/22/2021, Transfer Payroll, 25, PAYCHECK, 3316
10/22/2021, Transfer Payroll, 100, PAYCHECK, 3720
10/22/2021, Transfer Internal Account Transfer, -50, Transfer To Checking, 5197
10/22/2021, Transfer Internal Account Transfer, 25, Transfer From Checking, 8185
10/22/2021, Transfer Internal Account Transfer, -25, Transfer To Checking, 8828
10/22/2021, Transfer Internal Account Transfer, -25, Transfer To Checking, 8828
10/22/2021, Transfer Internal Account Transfer, -325, Transfer To Checking, 8828
10/22/2021, Shops Convenience Stores, -4.05, Circle K, 8869
10/22/2021, Transfer Internal Account Transfer, 325, Transfer From Checking, 8869
10/22/2021, Transfer Internal Account Transfer, 25, Transfer From Checking, 9116
10/24/2021, Travel Gas Stations, -7.01, POS Debit SHELL/SHELL, 8869
This is my initial attempt and I'm fairly new to Powershell.
$Table1 = Import-csv -path $COMBO_CSV -Delimiter "," | sort date -Descending
$Table2 = Import-csv -path $COMBO_CSV -Delimiter "," | sort date -Descending | Where-Object {
($_.amount -like "-*") -and
($_.payee -like "Transfer to*") }
$transfer_to=foreach ($t1 in $Table1) {
:outer
Foreach($t2 in $Table2) {
If(($t1.date -eq $t2.date) -and (-$t1.amount -eq $t2.amount)-and (($t1.payee -like "Transfer from*") -and ($t2.payee -like "Transfer to*"))) {
$t2.payee = "Transfer to $acctno"
$t2
break :outer
}
}
}
Upvotes: 1
Views: 52
Reputation: 5232
Instead of changing the original data I'd prefer to add an additional cell with the needed information ... like this:
$CSVInputData = @'
DATE, CATEGORY, AMOUNT, PAYEE, ACCOUNT#
10/19/2021, Transfer Internal Account Transfer, 34.04, Transfer From Checking, 5197
10/19/2021, Food and Drink Restaurants Fast Food, -15.09, Sonic, 7029
10/21/2021, Transfer Payroll, 700.2, ACH Transaction, 8828
10/21/2021, Food and Drink, -3, POS Debit VENDING, 8828
10/21/2021, Shops Supermarkets and Groceries, -4.2, Walmart, 8828
10/22/2021, Transfer Payroll, 25, PAYCHECK, 3316
10/22/2021, Transfer Payroll, 100, PAYCHECK, 3720
10/22/2021, Transfer Internal Account Transfer, -50, Transfer To Checking, 5197
10/22/2021, Transfer Internal Account Transfer, 25, Transfer From Checking, 8185
10/22/2021, Transfer Internal Account Transfer, -25, Transfer To Checking, 8828
10/22/2021, Transfer Internal Account Transfer, -25, Transfer To Checking, 8828
10/22/2021, Transfer Internal Account Transfer, -325, Transfer To Checking, 8828
10/22/2021, Shops Convenience Stores, -4.05, Circle K, 8869
10/22/2021, Transfer Internal Account Transfer, 325, Transfer From Checking, 8869
10/22/2021, Transfer Internal Account Transfer, 25, Transfer From Checking, 9116
10/24/2021, Travel Gas Stations, -7.01, POS Debit SHELL/SHELL, 8869
'@ |
ConvertFrom-Csv
$Result=
foreach ($item in $CSVInputData) {
$item |
Select-Object -Property *, @{
Name = 'PAYEE_ADV'; Expression = {
if ($_.PAYEE -match 'Transfer.*Checking') {
$_.PAYEE + ' ' + $_.'ACCOUNT#'
}
else { '' }
}
}
}
$Result |
Format-Table -AutoSize
Upvotes: 1