Text met dynamische header invoegen in ms access

Status
Niet open voor verdere reacties.

freakyfreak

Nieuwe gebruiker
Lid geworden
20 jan 2015
Berichten
2
Hallo,

ik heb een text file (stops.txt uit een GTFS provider) met een aantal headers: stop_id, stop_lat, stop_lon

Deze wil ik graag importeren in ms access via vba. Dit doe ik met een docmd transfertext en de specificationname maak ik aan door eerst een manuele import te doen van de text file.
Vervolgens import ik een dbf, link beide met elkaar en run een aantal query's.
Tot slot vraag ik naar een output folder, waar ik 3 subfolders aanmaak om 3 tabellen naar te exporteren en na deze export wordt de database leeg gemaakt (iedere tabel wordt verwijderd)

Het is met het importeren en het exporteren dat ik een probleem heb om dit dynamisch te maken. Wat bedoel ik met dynamisch: de code werkt alleen voor stop.txt files die dezelfde column headers hebben als de manueel geimporteerde textfile. Het is namelijk zo dat GTFS een deels vastliggend formaat is, maar er enkele optionele columns zijn en hierdoor de code spaak loopt. Dit zowel bij de import als bij de export

vb:

Stop.txt 1 heeft: stop_id, stop_lat, stop_lon
stop.txt 2 heeft: stop_id, stop_lon, stop_lat, stop_desc, stop_code

Als resultaat wil ik bekomen dat de gebruiker dus enkel de stop.txt locatie moet aangeven (via dialog venster) en een output locatie en dat al de rest in de achtergrond werkt.

Is er een soort code om in 1 en dezelfde database een text file in te laden (wat query's en enkele joins op los laten), de eindtabellen te exporteren, de database clearen en een nieuwe text file in te laden (met een ander aantal kolomen) en diezelfde query's en join erop los te laten?

alvast bedankt
 
Je gaat al fout in deze regel:
Deze wil ik graag importeren in ms access via vba. Dit doe ik met een docmd transfertext en de specificationname maak ik aan door eerst een manuele import te doen van de text file.
Zodra je met een importspecificatie gaat werken, moet elk importbestand voldoen aan de veldenspecs die je in de specificatie hebt vastgelegd. Jouw bestanden doen dat overduidelijk niet. En als ik je proces zo bekijk, zie ik ook weinig noodzaak voor zo'n specificatie. Gewoon importeren dat bestand. Zelf zou ik overigens geen tabellen verwijderen maar de tabel importeren in een eigen tabel, en de geïmporteerde gegevens vervolgens importeren in een vooraf opgemaakte tabel. Die vaste tabel maak je dan elke keer leeg, en vul je dus de volgende keer met de records uit de importtabel. Zo te zien hebben je velden wel steeds dezelfde veldnamen, dus dat mag geen probleem zijn.
In zo'n constructie kun je ook je queries en relaties al maken, want de échte tabellen heb je immers al.
Als je de import bestanden op een vaste plek zet (bijvoorbeeld het bureaublad van de gebruiker) met een vaste naam dan kun je de import overigens nog makkelijker maken, want dan hoef je ook niet meer om een import map te vragen.
 
FreakyFreak,

Als je twee voorbeeld tekstbestanden wilt maken en uploaden dan kunnen we kijken of we daar een VBA programma'tje van kunnen maken.
maar zonder de bestanden kunnen we natuurlijk helemaal niets.

Elsendoorn2134
 
FreakyFreak,

Als je twee voorbeeld tekstbestanden wilt maken en uploaden dan kunnen we kijken of we daar een VBA programma'tje van kunnen maken.
maar zonder de bestanden kunnen we natuurlijk helemaal niets.

Elsendoorn2134

In bijlage 2 verschillende stops.txt.Bekijk bijlage stops.txtBekijk bijlage stops.txt

Het is dus zo dat de eerste file 7 columns bevat en de 2e 8. Het is de bedoeling om bestand 1 in te laden, een aantal query's uit te voeren en die 7 columns + een 3tal vaste columns te exporteren. daarna wordt het 2e bestand ingeladen, diezelfde query's draaien en het resultaat = 8 columns van import + 3 vaste ook te exporteren. etc
 
Freakyfreak,

Hierbij een voorbeeld hoe je de bestanden dynamisch kan lezen.
De macro bepaald aan de hand van de eerste regel met de koprecords hoeveel
kolommen er in een tabel moeten worden gemaakt en schrijft dan in het bestand de
rest van de regels.

Veel Succes.

Bekijk bijlage LeesBestand.zip
 
Importeren:

Code:
Sub tst()
    With GetObject(, "access.application")
    
       .DoCmd.TransferText 0, "", "Nieuw", "G:\OF\upper.csv", True
        
    End With
End Sub

Vervolgens pas je de macro's aan afhankelijk van het aantal velden per record.
 
Laatst bewerkt:
Of, vanuit Access (en waarom zou je het ergens anders doen?)
Code:
Sub Import()
Dim fd As FileDialog

    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
        .AllowMultiSelect = False
        .Filters.Clear
        .Filters.Add "Access Databases", "*.TXT"
        If .Show = True Then
            DoCmd.TransferText acImportDelim, , "import", .Selecteditems(1), True
        End If
    End With
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan