Home > other >  Powershell - Comparing LineNumbers of lines that match
Powershell - Comparing LineNumbers of lines that match

Time:11-08

I'm having trouble to come up with solution that would compare LineNumbers of matching pairs from two lists. I will show you what I mean on example.

I have one SQL script, where I am inserting some data into existing tables. For ensuring repeatability of the script, before every insert into I am deleting the previous content of the table with "delete" statement. I am able to parse the file and check If every "insert into database1.table1" also have "delete from database1.table1" in the file. But i don't know how to check if the delete statement of the particular table is before the insert into statement (you need to delete the content of the table before you load new data into it). I figured I would need to use the LineNumber property, but I really don't know how to combine it with the database.table check.

This is what i got into first variable with this command:

$insertinto = Get-ChildItem "$packagepath\Init\" -Include 03_Init_*.txt -Recurse | Select-String -Pattern "insert into "

#content of variable
    C:\Users\hanus\Documents\sql_init.txt:42:insert into database1.table1
    C:\Users\hanus\Documents\sql_init.txt:130:insert into database1.table2
    C:\Users\hanus\Documents\sql_init.txt:282:insert into database2.table3

Here is what I got into second variable with this command:

$deletefrom = Get-ChildItem "$packagepath\Init\" -Include 03_Init_*.txt  -Recurse | Select-String -Pattern "delete from "
#content of the variable
C:\Users\hanus\Documents\sql_init.txt:40:delete from database1.table1;
C:\Users\hanus\Documents\sql_init.txt:128:delete from database1.table2;
C:\Users\hanus\Documents\sql_init.txt:280:delete from database2.table3;

The expected output would be something like: This"delete from" statement is not before "insert into" statement, even though it's in the file.

I hope I described the problem well. I am new to Powershell and scripting so be please patient with me. Thank you for any help in advance!

CodePudding user response:

You're already using Select-String, so this should be pretty simple. The content of those variables is far more than you're seeing there. Run this:

$deletefrom | Format-List * -Force

You'll see that each match contains an object with properties for what file the match is from, what line number the match was found on, and more. I think if you capture the table that is being modified in your Select-String with a look behind of what you're searching on now you could group on that, and then alert on times where the delete happens after the insert.

Get-ChildItem "$packagepath\Init\*" -Include 03_Init_*.txt  -Recurse | 
    Select-String "(?<=delete from |insert into )([^;] )" |
    Group-Object {$_.Matches[0].value} |
    ForEach-Object {
        if($_.group[0] -notmatch 'delete from'){Write-Warning "Inserting into $($_.Name) before deleting"}
    }
  • Related