[batch windows] bestanden vergelijken en output naar file

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Fairy
  • Registratie: Januari 2001
  • Niet online
Ik zit met een beetje lastige situatie. Die is als volgt.

Wij hebben een applicatie draaien die elke 2 uur gegevens krijgt aangeleverd middels een batch. Dit zijn vele duizenden regels. Elke keer wordt het gehele bestand ingelezen, wat veel tijd en cpu kracht kost, de applicatie die het inleest, importeert alle records steeds opnieuw in zijn database. Intussen zijn we op het punt dat er bijna een overlap is tussen de ene run en de volgende run.

Deze importslag is echter te optimaliseren door alleen de gewijzigde regels in te lezen, maar dan moet er een vergelijking worden gedaan met de vorige file en de huidige file. Echter is het probleem dat de volgorde van de regels kunnen veranderen als zich wijzigingen voordoen. Een bepaald record kan in de ene import op regel 10 staan en in de volgens de 5000.

Als wij alleen de gewijzigde regels kunnen inlezen en niet telkens het volledige bestand, zal zit een tijdsbesparing van letterlijk 99,9% zijn.

Is er een manier om in een simpel batch script (middels een executable aan te roepen uiteraard) een vergelijking te maken tussen 2 files en de verschillen te distilleren?

Ik hoop dat iemand me op de juiste weg kan helpen.

Alvast hartelijk dank!

Alle reacties


Acties:
  • 0 Henk 'm!

  • ThunderNet
  • Registratie: Juni 2004
  • Laatst online: 27-06 15:46

ThunderNet

Flits!

Hoe identificeer je de wijziging dan? Hebben alle regels een eigen ID, of? Waar herken je een wijziging aan en wat is een volledig nieuwe record?

Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 14:33
Worden er alleen regels tussen gevoegd (blijven ze dus op volgorde) of is het echt willekeurige volgorde?

Acties:
  • 0 Henk 'm!

  • fonsoy
  • Registratie: Juli 2009
  • Laatst online: 28-06 23:53
Als de volgorde van de regels steeds wisselt, zal het vergelijken van de regel er ook niet om liegen qua resourcegebruik.
Het lijkt mij voor de hand liggend dat je per regel in het nieuwe bestand de oude regel erbij probeert te zoeken. Als dat niet lukt schiet je 'm de DB in.

Lenovo W520 - i7 2720QM - 8GB DDR3 1333Mhz - 1080p - Nvidia 1000M - 9 cell accu


Acties:
  • 0 Henk 'm!

  • Donaldinho
  • Registratie: November 2002
  • Laatst online: 28-06 18:05
eerste twee vragen zijn goede - als een regel een unieke wijziging bevat zou je eerst files kunnen sorteren, daana met fc (op windows) verschillen uit kunnen lezen.

Als een (1) wijziging over meerdere regels doorlopen dan wordt het snel complexer.

You almost can’t blame him or the other diet gurus for leaning in on the techno-bullshit market; it’s hard to fill up a 300 page diet book on “eat a bit less and find a type of exercise that doesn’t make you hate life.”


Acties:
  • 0 Henk 'm!

  • Smelt
  • Registratie: Maart 2005
  • Laatst online: 19-06 17:10
Powershell heeft een groot aantal mogelijkheden om zaken te vergelijken en sorteren.

het ligt er natuurlijk heel erg aan het soort bestanden en wat de unieke waarden zijn

Acties:
  • 0 Henk 'm!

  • Fairy
  • Registratie: Januari 2001
  • Niet online
Er zit wel een uniek nummer in, maar niet steeds op dezelfde plek.

Het ene record begint met een datum, puntkomma en dan een uniek nummer, maar soms begint deze met een puntkomma en dan het unieke nummer.

Nu ben ik geen held in dit soort procedures, maar ik wil het toch graag voor elkaar krijgen zonder meteen een externe club te moeten aantrekken hiervoor. Zo moeilijk kan het niet zijn?

Ik heb wel een voorbeeldje, maar omdat het om persoonsgegevens gaat moet ik heel voorzichtig zijn, dus maar even fictief:

01/03/2016;00501542;Jansen;Piet;dorpsweg 80

In het volgende bestand staat dan:
01/03/2016;00501542;Jansen;Piet;dorpsweg 99

Persoon is verhuisd, dus het record moet naar een nieuwe file.

Er kan ook wat anders gebeuren:
;00501542;Jansen;Piet;dorpsweg 80

Zelfde persoon, maar het contract is omgezet naar vast.

Acties:
  • +1 Henk 'm!

  • narotic
  • Registratie: Maart 2002
  • Laatst online: 02-11-2021
Volgens mij ben je dan dus op zoek naar de relative complement van de oude batch in de nieuwe batch. Met andere woorden, alle regels in de nieuwe batch die niet exact voorkomen in de oude batch. Ik ben geen held met windows command line, maar met linux tools als grep en awk bereken je die in luttele seconden voor een paar duizend regels.

Echter, kan het ook voorkomen dat regels uit de database verdwijnen? Ik zou hoe dan ook aanraden om in ieder geval 1 keer in de zoveel tijd de batch weer "volledig" te importeren om dat soort fouten te ondervangen.

Edit: volgens mij zoiets dus in powershell:
code:
1
Get-Content new.txt | ?{-not ($(Get-Content old.txt) -contains $_)}

[ Voor 24% gewijzigd door narotic op 18-05-2016 17:02 ]

- = Step Into The Pit | Industrial Strength = -


Acties:
  • 0 Henk 'm!

  • Smelt
  • Registratie: Maart 2005
  • Laatst online: 19-06 17:10
dat ziet eruit als CSV bestanden maar extensie hoeft verder niet uit te maken

als er al een header in het bestand staat dan kan deze nog uit onderstaande scripts

onderstaand powershell script importeert de bestanden en vergelijkt deze

PowerShell: compare
1
2
3
4
5
$header = "Date","ID","voornaam","achternaam","adress" 
$filenew = Import-Csv -Delimiter ";" "C:\filenew.ext" -header $header | Sort id
$fileold = Import-Csv -Delimiter ";" "C:\fileold.ext" -header $header | Sort id

compare-object -referenceobject $fileold -differenceobject $filenew  | Where-Object {$_.SideIndicator -eq '=>'} | Export-Csv -Delimiter ";" -NoTypeInformation "C:\changes.csv"


ik weet niet zeker of compare-object goed werkt met het ontbreken van regels dan zou onderstaande misschien beter werken

PowerShell: compare
1
2
3
4
$header = "Date","ID","voornaam","achterbaan","straat" 
$filenew = Import-Csv -Delimiter ";" "C:\filenew.ext" -header $header | Sort id
$fileold = Import-Csv -Delimiter ";" "C:\fileold.ext" -header $header | Sort id
$fileold | Where-Object{$filenew -notcontains $_} | Export-Csv -Delimiter ";" -NoTypeInformation "C:\changes.csv"


bestands locaties/namen moeten nog aangepast worden

bovenstaande dient als voorbeeld en zal getest moeten worden om goed te werken

ik ga er vanuit dat er geen regels verwijdert hoeven te worden, want dat kan echt alleen door nieuwe bestand te importeren en alle oude gegevens te verwijderen zoals het nu waarschijnlijk gaat.

het is ook mogelijk bovenstaande aan te passen naar een enkele regel code maar dit heb ik voor de leesbaarheid even niet gedaan

Acties:
  • 0 Henk 'm!

  • narotic
  • Registratie: Maart 2002
  • Laatst online: 02-11-2021
Smelt schreef op woensdag 18 mei 2016 @ 17:03:
compare-object -referenceobject $fileold -differenceobject $filenew | Where-Object {$_.SideIndicator -eq '=>'} | Export-Csv -Delimiter ";" -NoTypeInformation "C:\changes.csv"
[/code]
offtopic:
Ik dacht al dat het ook met compare-object op de een of andere manier moest kunnen, maar dit is dus de truc die ik miste :)

- = Step Into The Pit | Industrial Strength = -


Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 15:21
narotic schreef op woensdag 18 mei 2016 @ 21:30:
[...]


offtopic:
Ik dacht al dat het ook met compare-object op de een of andere manier moest kunnen, maar dit is dus de truc die ik miste :)
Ik ben nog steeds van mening dat compare-object meer parameters mbt de side indicator (of alleen left of right als switch optie) had moeten bevatten.

Acties:
  • 0 Henk 'm!

  • Fairy
  • Registratie: Januari 2001
  • Niet online
Bedankt voor alle antwoorden! Ik ga kijken of ik dat in de praktijk toegepast kan krijgen!

Acties:
  • 0 Henk 'm!

  • Montaner
  • Registratie: Januari 2005
  • Laatst online: 28-06 21:52
Fairy schreef op donderdag 19 mei 2016 @ 08:04:
Bedankt voor alle antwoorden! Ik ga kijken of ik dat in de praktijk toegepast kan krijgen!
Gebruik je MSSQL? Kijk dan eens naar SSIS. In deze tutorial wordt jouw 'probleem' volledig beschreven:
http://www.sqlservercentral.com/stairway/72494/

Acties:
  • 0 Henk 'm!

  • Fairy
  • Registratie: Januari 2001
  • Niet online
trix0r schreef op donderdag 19 mei 2016 @ 12:55:
[...]

Gebruik je MSSQL? Kijk dan eens naar SSIS. In deze tutorial wordt jouw 'probleem' volledig beschreven:
http://www.sqlservercentral.com/stairway/72494/
Helaas niet, de data komt uit een pakket uit de cloud via een secure FTP sessie, elke keer een heel bestand en wordt daarna ingelezen in een applicatie die een bestand oppakt en inleest. Dat gaat middels allerlei processen, dus inschieten in SQL is er niet bij.
Pagina: 1