I have two CSV files:
CSV_1:
Name,Age,
John,20
Amy,25
Joe,30
CSV_2:
Name,Address
JohnDoe,123 street
AmyDoe,456 street
JoeSmith,789 drive
Is there a way to join them together in Powershell using SQL LIKE syntax?
For example:
select *, csv2.address from csv1
left join csv2 on csv2.Name LIKE (csv1.Name '%%')
I tried to use the JOIN-OBJECT module but it doesn't look like there is way to use this kind of filtering. Or maybe I cannot find an example to do it. It has to be done in Powershell due to some restrictions. Any help on this is appreciated.
Thanks
CodePudding user response:
$a = ConvertFrom-Csv @'
Name,Age,
John,20
Amy,25
Joe,30
'@
$b = ConvertFrom-Csv @'
Name,Address
JohnDoe,123 street
AmyDoe,456 street
JoeSmith,789 drive
'@
Using this Join-Object script/Join-Object Module (see also: In Powershell, what's the best way to join two tables into one?), you might do something like this:
$a |Join $b -Using { $Right.Name -Like "$($Left.Name)*" }
Name Age Address
---- --- -------
{John, JohnDoe} 20 123 street
{Amy, AmyDoe} 25 456 street
{Joe, JoeSmith} 30 789 drive
To separate the names:
$a |Join $b -Using { $Right.Name -Like "$($Left.Name)*" } -Name A,B
AName BName Age Address
----- ----- --- -------
John JohnDoe 20 123 street
Amy AmyDoe 25 456 street
Joe JoeSmith 30 789 drive
Note that besides the fact that there is a risk that e.g. a Jon will be matched with a JonathanDoe, the -Using parameter is rather slow.
If the full names are actually in camelCase or PascalCase, it will be faster to strip off the surname first (which might be done for both sides):
'JohnDoe' -CReplace '(?<=. )[A-Z] .*'
John
$a |Join $b -On { $_.Name -CReplace '(?<=. )[A-Z] .*' } -Name A,B
AName BName Age Address
----- ----- --- -------
John JohnDoe 20 123 street
Amy AmyDoe 25 456 street
Joe JoeSmith 30 789 drive
