[Access|VBA] Miljoen regels lezen en in database stoppen.

Pagina: 1
Acties:

  • Dedgeh
  • Registratie: Februari 2005
  • Laatst online: 18-07 11:02
Hoi,

Ik ben bezig om een programmatje te maken dat voor mij enorm veel regels text leest en vervolgens in een database in access 2007 opsla.

Alleen zit het net wat lastiger dan normaal.
De bestanden bevinden zich namelijk in verschillende mappen.
Ik heb één hoofdmap, met daarin verschillende mappen (AX1_2008, AX1_2009, AX2_2008, AX2_2009, etc...).
Dit zijn in totaal 103 mappen.

In die mappen bevindenden zich elk ongeveer 100 bestanden (*.OID, is feitelijk een ASCII .txt bestand)

In 1 zo'n bestanden bevinden zich data in de vorm van

Header;HeaderInfo;Etc;
Trade1;data;start;end
Trade2;data;start;end
Trade3;data;start;end
...etc

Vervolgens wil ik werkelijk alle Trade's in een database stoppen met de vorm van
Header HeaderInfo Trade1 data start end
Header HeaderInfo Trade2 data start end
Header HeaderInfo Trade3 data start end

Die tabel zal dus een ongeveer miljoen regels gaan bevatten.

Nu ben ik enigzins wel een beetje thuis in programeren, maar vooral OOP, en VBA heb ik nog nooit aangeraakt en na vershcillende tuto's gelezen te hebben werd het me alleen maar waziger. Ook alle video tuto's op youtube bijvoorbeeld komen totaal niet overeen met mijn Office 2007 Access mogelijkheden.

Dus de simpele maar toch lastige vraag, heeft er iemand een klein opstapje naar een site waar het wel goed uitgelegd staat, of simpelweg een klein fundament om mee te beginnen.

Bedankt alvast :)

PS. Al heb je nog info nodig, vraag!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19-07 14:09

Dido

heforshe

De relatie tussen wat er in je tekstbestanden staat en wat er in je databse moet komen is me niet duidelijk.

Wat is data start end? Wil je dat optellen per trade? Wat voor headerinfo hebben we het over?
Wil je de hele zwik in een enkele tabel opslaan, of slaat de headerinfo daadwerkelijk op de detailregels eronder (wat voor de hand ligt). Hoe kom je van 10 miljoen tot 1 miljoen records?

Voor wat betreft de daadwerkelijke verwerking, dat is basiskennis programmeren: lees alle namen van de subdirectories, loop daar doorheen, per directory lees alle bestandsnamen, per bestand: openen, regels lezen en verwerken.

Wat betekent mijn avatar?


  • Dedgeh
  • Registratie: Februari 2005
  • Laatst online: 18-07 11:02
Het gaat om een verwerking van alles beurs trades.

De mappen bestaan uit AX1_2008, AX2_2008 etc.
AX1 stelt dag 1 van de maand voor, AX2 dag 2 van elke maand.
De verschillende mappen zijn nodig om dubbele bestandsnamen te voorkomen.
In elk bestand wat in alle mappen staat staan een aantal trades opgeslagen.
Elk bestand representeert een momentopname.

In elke bestand staat vervolgens eerst in de header het tijdstip van het kopen van de trades, en de huidige AEX koers.
Vervolgens staan daaronder alle trades die op dat moment zijn gehandeld.

Nu wil ik in de database alle trades neerzetten (data;end etc maar een voorbeeld, in werkelijkheid staan er zo'n 7 variabelen in elke regel. in de opzet van: 1;2;3;4;5;6;7;.

Om die trades op te slaan in de database, moet er bij elke trade (dus de 7 attributen) ook nog de headerinformatie staan.

Uiteindelijk krijg ik dus een tabel met een x aantal zulke objecten:

Headerinfo 1 2 3 4 5 6 7
etc... x 1 miljoen.

Is het zo al wat duidelijker?

PS.
de basiskennis programeren is nu juist wat me tekort schiet. Ik zou zoiets met gemak kunnen maken in bijv java of php, maar in VBA ziet het er allemaal een stuk anders uit. Is er bijv een template beschikbaar die wel bij mij werkt waarin files/dir's worden gelezen?

[ Voor 11% gewijzigd door Dedgeh op 10-12-2009 20:39 ]


  • MAX3400
  • Registratie: Mei 2003
  • Laatst online: 10-07 12:56

MAX3400

XBL: OctagonQontrol

Per direct: stap van Access af want dat wordt een draak van een db om te beheren. Beter iets van MySQL of SQL ofzo inzetten voor miljoenen records.

Verder kan je dan met een stored procedure (en mogelijk een aanverwant custom vbs-filter van te voren), de data importeren en in de correcte records laten stoppen. Er is op dit geen enkel verband tussen de bestanden (zelfs niet uit directoryX) dus ik weet niet of een db wel gaat doen wat je uiteindelijk wil

Mijn advertenties!!! | Mijn antwoorden zijn vaak niet snowflake-proof


  • Dedgeh
  • Registratie: Februari 2005
  • Laatst online: 18-07 11:02
Het probleem dat de database gebruikt moet worden in excel, hier wordt alle data dus verwerkt. Of is er een optie om te praten tussen excel en mysql?

  • Boss
  • Registratie: September 1999
  • Laatst online: 06:42

Boss

+1 Overgewaardeerd

Het commando om in Access een tekstbestand te importeren is DoCmd.Transferspreadsheet. Daar moet je vervolgens de juiste parameters aan meegeven om het juiste bestand in de juiste tabel toe te voegen.

Is het een 1-malige operatie dan kan je het handmatig doen, anders is het wel handig om wat te coden om de juiste bestanden door te lezen.

Dit werkt dus alleen als de data in nette (csv / xls) bestanden staat. Als dat niet het geval is zal je de tekstbestanden in code moeten openen en regel voor regel doorlopen. Dat kan ook.

Heb je een reden om het in Access te willen doen? Ik doe redelijk veel in Access (ook importdingen zoals je hier beschrijft) maar zou voor het parsen van tekstfiles en data opslaan toch snel een andere tool gebruiken, C# of Delphi bijvoorbeeld.

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • MAX3400
  • Registratie: Mei 2003
  • Laatst online: 10-07 12:56

MAX3400

XBL: OctagonQontrol

Nairety schreef op donderdag 10 december 2009 @ 20:40:
Het probleem dat de database gebruikt moet worden in excel, hier wordt alle data dus verwerkt. Of is er een optie om te praten tussen excel en mysql?
Google maar eens naar "odbc mysql to excel" ;)

Mijn advertenties!!! | Mijn antwoorden zijn vaak niet snowflake-proof


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Als er in totaal maar 1 gebruiker tegelijkertijd is, je de data 1 keer importeerd, en je wat berekeningen wilt doen in Excel, dan lijkt mij een Access-, SQL Compact- of SQLite-database toch een stuk makkelijker dan het installeren van een (M(y))SQL Server... . 1 miljoen regels is geen enkel probleem, dat komt niet in de buurt van 1GB op deze manier.

Verder: als je java kan, en geen VBA wil leren, waarom zou je dan niet gewoon vanuit java gaan werken? Er is geen enkel reden om juist VBA te gebruiken. :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Dedgeh
  • Registratie: Februari 2005
  • Laatst online: 18-07 11:02
Nu ja, ik wil wel VBA leren, dit stukje lijkt me niet supergemakkelijk maar wel op de basismogelijkheden van VBA te gaan begrijpen. Als ik het echt opgeef zal ik het wel in java gaan maken, maar nieuwe kennis is altijd welkom toch? :D

(ik heb trouwens al wel een werkend iets in java dat alle bestanden in 1 map afgaat en dit in 1 .txt bestand weer wegschrijft, alleen kwam ik hier met een memory error.)

[ Voor 26% gewijzigd door Dedgeh op 10-12-2009 21:06 ]


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Nairety schreef op donderdag 10 december 2009 @ 21:04:
Nu ja, ik wil wel VBA leren, dit stukje lijkt me niet supergemakkelijk maar wel op de basismogelijkheden van VBA te gaan begrijpen.
[google=vba tutorial] of [google=access vba tutorial]? ;)

En naar welke VBA-functies je moet kijken vind je toch vrij snel?
http://bytes.com/topic/ac...2-import-all-files-folder
En voor de rest is het een kwestie van de help gebruiken of nog even verder googelen.. :)
(ik heb trouwens al wel een werkend iets in java dat alle bestanden in 1 map afgaat en dit in 1 .txt bestand weer wegschrijft, alleen kwam ik hier met een memory error.)
Dan laat je te veel referenties achter, of schrijf je alles eerst weg naar het geheugen. Maar probeer het anders eens met "java -Xms128m -Xmx1500m ..." of zelfs nog meer.. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • terje7601
  • Registratie: September 2009
  • Laatst online: 08-02-2024
Persoonlijk zou ik aanraden om voor het importeren van de bestanden in een Access db gewoon Java te gebruiken. Je kent het al & zoals je aangeeft is het een simpel probleem.
VBA kun je mijns inziens efficiënter leren door in bijv. Excel een paar interessante macro's aan te maken & dan de code te bestuderen of te proberen om je Access database te gebruiken in Excel VBA of iets dergelijks.

edit: voor de memory error kun je eventueel ook
java -XX:+HeapDumpOnOutOfMemoryError ...
gebruiken, waarna je a.d.h.v. de heap dump kan kijken wat er misloopt.

[ Voor 17% gewijzigd door terje7601 op 10-12-2009 21:50 ]


Acties:
  • 0 Henk 'm!

  • Dedgeh
  • Registratie: Februari 2005
  • Laatst online: 18-07 11:02
Ik heb nu, dankzij visual studio een redelijk werkend iets. Het is nog alleen maar het gedeelte waar 1 bestand wordt gelezen.

Ik zit nu alleen met het probleem dat ik geen flauw idee heb hoe ik nu samen ga werken met de access database.
Ik heb eerst geprobeerd alles te schrijven naar een tekstbestand, maar dan kom ik met de fout dat het bestand 'resultaat.txt' dus al in gebruik is.

Ik heb al verschillende dingen natuurlijk geprobeerd, maar ik krijg dan voornamelijk tutorials met het visuele gedeelte van visual studio, en niet het script gedeelte.
Het access database is nu een .accdb bestand. Hoe connect ik die nu goed met het script?

  • Dedgeh
  • Registratie: Februari 2005
  • Laatst online: 18-07 11:02
Ik denk dat ik zo ongeveer bijna klaar ben met het programma, alleen zit me nog 1 ding tegen. De connectie tussen VB <-> Access.

Na wat vogelen ben ik er dus fijn achter gekomen dat Jet.OleDB.4.0 dus niet werkt op 64 bit, en dacht ik te begrijpen om ACE 12.0 te moeten gaan gebruiken. Echter snap ik er nu helemaal niks meer van.

Ook is er een probleem, dat mijn laptop 64-bit Windows7 gebruikt, maar degene die het programma zal gaan gebruiken gebruikt Windows XP. Beide systemen werken met Office 2007.

Oftewel, kan ik het oplossen dat het beide werkt op mijn laptop / gebruiker?
Gegevens:
Mijn laptop:
Windows 7 - 64-bit
Office 2007
Gebruik Visual Basic .NET 3.5

Gebruiker:
Windows XP SP2
Office 2007

Bedankt :)

  • pedorus
  • Registratie: Januari 2008
  • Niet online
[google=jet.oledb.4.0 64 bit] geeft:
http://social.msdn.micros...c8-4716-a15a-356206d750ba

Met instructies dat je <PlatformTarget>x86</PlatformTarget> moet toevoegen in je vbproj-bestand. :)

Overigens ondersteund SQL Server Compact Edition wel 64 bit (maar goed, dat is nu wat laat, en misschien wil je juist Access).

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1