Bericht 1 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Jan101477 | Datum | : | 10-11-2007 |
Aan | : | Allen | MsgID | : | 3618.1 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Hallo,
Ik probeer een door spaties gescheiden bestand te lezen, dat gedeeltelijk ASCII-tekens bevat en gedeeltelijk onleesbare rommel. Ik wil het ASCII-gedeelte naar een listbox brengen om vandaar naar een database over te brengen. Ik heb het internet afgezocht naar bruikbare voorbeeldcode voor Visual Basic (Fortran of C++ mag ook), maar kan nergens iets bruikbaars vinden. Weet iemand misschien een vindplaats of heeft zelf een goede oplossing?
Bericht 2 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Peter | Datum | : | 10-11-2007 |
Aan | : | Jan101477 | MsgID | : | 3618.2 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Hoi Jan,
>>Ik probeer een door spaties gescheiden bestand te lezen, dat gedeeltelijk ASCII-tekens bevat en gedeeltelijk onleesbare rommel.<<
Een ASCII-tekenset is een verzameling van letters, cijfers, leestekens en andere symbolen. Waarschijnlijk bedoel je hier dan de leesbare ASCII tekens scheiden van de onleesbare tekens.
In de kop van dit bericht zeg je dat de spatie het scheidingsteken is. Is dat per regel of per aantal bytes?
Met de
Split() functie, standaard in VB6, kun je tekst ontleden en in een array zetten.
Heb je een voorbeeld van dat bestand of een deel ervan, dat praat wat makkelijker.
Peter
Bericht 3 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Jan101477 | Datum | : | 10-11-2007 |
Aan | : | Peter | MsgID | : | 3618.3 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Hoi Peter,
Ik voeg hier een bestand bij dat een aantal regels bevat met als leesbare tekst het symbool en de naam van aandelen op EuroNext. Ik wil uit dit bestand alle rommel verwijderen en het symbool en de naam overhouden, om deze daarna in een database op te slaan. Ik weet echter niet hoe je leesbare tekens en rommel in Visual Basic van elkaar onderscheidt.
De velden zijn van elkaar gescheiden door meerdere spaties.
| Bijlagen : master.fqr 17KB |
Bericht 4 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Just Vecht | Datum | : | 10-11-2007 | Aan | : | Jan101477 | MsgID | : | 3618.4 | Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Hallo Jan, >> De velden zijn van elkaar gescheiden door meerdere spaties << Weet je het zeker? Ik ben wel helemaal niet thuis in VB, maar met spatie gedelimiteerde tekstbestanden kan ik me uitstekend redden. Ik heb je voorbeeld bestandje in wat van die hoogst gecompliceerde tekst-editors voor programmeurs gegooid hier in mijn Linux bak. Ik krijg wat waarschuwingen dat het een binair bestand is en ik zie inderdaad een inhoud zoals ik dat van binaire bestanden ken. Is er wellicht in het totstandkomen van dit bestand ergens iets fout gegaan? Dan zou je de oplossing op de verkeerde plek zoeken. groetjes, Just Vecht mijn Blog en meer |
Bericht 5 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Michel Uphoff (Sysop) | Datum | : | 10-11-2007 |
Aan | : | Jan101477 | MsgID | : | 3618.5 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Hoi Jan,
Dat lijkt mij geen teken gescheiden bestand. Het is zo te zien een database met vaste breedte voor de records (91 bytes).
Dus die database inlezen als string en vervolgens hapjes van 91 bytes uit die string knippen en opslaan zou een overzichtelijke stap 1 zijn. Daarna lan je even kijken welke posities er nog uit die 'records' van 91 bytes weggeknipt moeten worden om jouw gewenste output over te houden.
De records beginnen met 00 44 0F hex, 40 posities verderop de fonds tag, deze begint dus op pos 43 en na deze tag op positie 52 de volledige naam.
(wel even alle posities natellen ik kan me in het preciese aantal vergist hebben)
Met de string opdrachten van VB6 is het vervolgens heel goed te doen de gewenste onderdelen er uit te knippen. Als je daar niet uitkomt, geef je maar een gil.
Michel Uphoff (NLcomputer)
Homepage
Bericht 6 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Peter | Datum | : | 11-11-2007 |
Aan | : | Jan101477 | MsgID | : | 3618.6 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
>>De velden zijn van elkaar gescheiden door meerdere spaties.<<
Dat klopt niet. Zoals Just en Michel ook al opmerkte, is dit geen spatie-gescheiden data bestand maar heeft een hele andere structuur. De rommel die je beschrijft lijken me data-bytes.
Je wilt alleen wat teksten en die zul je er dus zelf uit moeten filteren.
De recordlengte is 91 bytes en het 1e record bevat voor jouw geen nuttige info.
Een voorbeeldje hoe je dat zou kunnen doen:
Private Sub CmdReadFile_Click()
'Lees databestand, haal de korte en lange naam eruit en zet die in een listbox
Dim arr As Variant
Dim i As Long
Dim buf As String, rec As String
List1.Clear 'wis lijst
buf = ReadTextFile(App.Path & "\master.fqr") 'lees bestand
i = 92 '1e record overslaan
Do
rec = Mid$(buf, i, 91) 'lees 1 record
arr = Split(rec, Chr(0)) 'opdelen, scheidingsteken = chr$(0)
List1.AddItem arr(0) & vbTab & arr(2) '1e en 3e item weergeven
i = i + 91 'volgende record
Loop While i <= Len(buf) 'tot alle gehad
End Sub
Function ReadTextFile(ByVal FileName As String) As String
'bestand lezen, als niet gevonden dan geef lege string terug
Dim ff As Integer
On Error GoTo errhandle
ff = FreeFile
Open FileName For Binary As #ff
ReadTextFile = Space$(LOF(ff))
Get #ff, , ReadTextFile
errexit:
Close #ff
Exit Function
errhandle:
Resume errexit
End Function
Peter
Bericht 7 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Jan101477 | Datum | : | 12-11-2007 |
Aan | : | Peter | MsgID | : | 3618.7 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Hoi Peter,
Hartelijk dank voor je reactie en het codevoorbeeld. Het werkt prima, maar geeft een type mismatch op Chr$(0). Moet het scheidingsteken soms iets anders dan spatie zijn?
Bericht 8 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Jan101477 | Datum | : | 12-11-2007 |
Aan | : | Just Vecht | MsgID | : | 3618.8 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Hallo Just,
Hartelijk dank voor je reactie. Ik zocht het dus helemaal in de verkeerde richting. Er is niets mis gegaan met het bestand: het bevat elke keer dezelfde soort informatie.
Zoals je gezien hebt wordt je vermoeden door Michel en Peter bevestigd.
Bericht 9 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Jan101477 | Datum | : | 12-11-2007 |
Aan | : | Michel Uphoff (Sysop) | MsgID | : | 3618.9 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Hoi Michel,
Hartelijk dank voor je reactie.Je reactie en die van Just en Peter hebben me behoed voor zoeken in de verkeerde richting en hebben me daardoor wellicht veel tijd bespaard. Het uitfilteren van de gegevens die ik moet hebben zal waarschijnlijk wel lukken met de stringopdrachten van VB6. Mocht ik daar toch niet uit komen dan kom ik daarvoor graag bij je terug, maar met het codevoorbeeld van Peter lukt het zo te zien wel.
Bericht 10 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Jan101477 | Datum | : | 12-11-2007 |
Aan | : | Just Vecht | MsgID | : | 3618.10 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Hallo Just,
Ik vergat nog wat. Je spreekt in je reactie over tekst editors voor programmeurs. Ik heb regelmatig bestanden waarvan ik wil weten wat het voor bestanden zijn. Deze tekst editors zouden me daarbij wellicht kunnen helpen. Waar zijn dat soort programma's te krijgen? Heb je een link naar zo'n site of de naam van zo'n editor? In dat geval houd ik me aanbevolen.
Bericht 11 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Stefan de Best (Sysop) | Datum | : | 12-11-2007 |
Aan | : | Jan101477 | MsgID | : | 3618.11 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Hoi Jan,
>> Ik heb regelmatig bestanden waarvan ik
>> wil weten wat het voor bestanden zijn.Wat ik een héél interessante website is deze:
http://www.wotsit.org/Ik denk dat je dat ook wel interessant vindt.
S t e f a n
Overzicht van 150 oude en minder bekende zwemslagen
http://tinyurl.com/yuojv[/]
Bericht 12 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Peter | Datum | : | 12-11-2007 |
Aan | : | Jan101477 | MsgID | : | 3618.12 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Jan,
>>Het werkt prima, maar geeft een type mismatch op Chr$(0). Moet het scheidingsteken soms iets anders dan spatie zijn?<<
Vreemd, "het werkt prima, maar geeft een type mismatch". Dan werkt het toch niet of mis ik iets?
Het scheidingsteken is geen spatie maar karakter-code nul.
Heb je code precies gekopieerd? Hier werkt het prima.
Is de variable
arr wel goed gedemensioneerd:
Dim arr As VariantLukt het dan nog niet, hier is een andere, minder universele, oplossing:
vervang deze code
arr = Split(rec, Chr$(0)) 'opdelen, scheiding = chr$(0)
List1.AddItem arr(0) & vbTab & arr(2) '1e en 3e item weergeven
door
Dim p As Long
Dim txt1 As String, txt2 As String
p = InStr(rec, Chr$(0)) - 1 'zoek positie tot einde 1e tekst
txt1 = Left$(rec, p) 'haal eerste tekst
p = InStr(10, rec, Chr$(0)) - 1 'zoek positie tot einde 2e tekst
txt2 = Mid$(rec, 10, p - 9) 'haal tweede tekst
List1.AddItem txt1 & vbTab & txt2 'de 2 teksten weergeven
Lukt het nu wel ?
Peter
Bericht 13 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Jan101477 | Datum | : | 12-11-2007 |
Aan | : | Stefan de Best (Sysop) | MsgID | : | 3618.13 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Hoi Stefan,
Bedankt voor de link. Daar zijn inderdaad veel bestandsformaten te vinden en dat kan zeker nuttig zijn.
Bericht 14 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Jan101477 | Datum | : | 12-11-2007 |
Aan | : | Peter | MsgID | : | 3618.14 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Peter,
Om er zeker van te zijn dat ik de code letterlijk overneem, heb ik de eerder gemaakte code geheel verwijderd en daarna gekopieerd uit je bericht en geplakt. Ik heb alleen de list een ander nummer gegeven omdat ik list1 al had voor een ander doel.
Nu is de eerdere fout weg, maar geeft hij error 9 op
List2.AddItem arr(0) & vbTab & arr(2).
Rer controle hecht ik mijn versie hier aan.
| Bijlagen : frmCatalogus.frm 3KB |
Bericht 15 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Just Vecht | Datum | : | 12-11-2007 | Aan | : | Jan101477 | MsgID | : | 3618.15 | Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Hallo Jan, >> tekst editors voor programmeurs << Ik ken er drie voor zover mijn verstand als niet-programmeur in deze reikt. Emacs is de oudste, Vim een veelgebruikte en zelf vind ik SciTe een lekker eenvoudige editor. Hier zijn de links: http://www.gnu.org/software/emacs/http://www.vim.org/download.phphttp://www.scintilla.org/SciTE.htmlZe komen alle drie uit de Linux wereld. Volgens mij draait straks alle software uit de Linux omgeving probleemloos onder Windows. Het is nu al zo dat ik op mijn Windows Vista laptop helemaal geen betaalde software heb staan. Ik heb bijvoorbeeld OpenOffice, Thunderbird en Firefox. Maar dat terzijde. Succes!
(Emacs onder Windows <zucht>, gekker moet het niet worden) groetjes,
Just Vecht mijn Blog en meer |
Bericht 16 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Peter | Datum | : | 12-11-2007 |
Aan | : | Jan101477 | MsgID | : | 3618.16 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Jan,
>>Nu is de eerdere fout weg, maar geeft hij error 9 op List2.AddItem arr(0) & vbTab & arr(2).<<
Error 9: Subscript out of range
2 mogelijkheden:
a) Er is geen bestand ingelezen omdat de map of naam niet goed is.
buf en
rec blijven dan leeg en dus zal
arr ook geen items bevatten.
b) De bestandsgrootte is gewijzigd en
arr bevat minder dan 3 items in een record.
Om dit probleem te vookomen, vervang
List2.AddItem arr(0) & vbTab & arr(2) '1e en 3e item weergeven
door
If UBound(arr) > 1 Then 'als voldoende items in array
List2.AddItem arr(0) & vbTab & arr(2) '1e en 3e item weergeven
End If
Lukt het nu wel?
Peter
Bericht 17 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Jan101477 | Datum | : | 13-11-2007 |
Aan | : | Peter | MsgID | : | 3618.17 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Hoi Michel,
Je hebt gelijk. Het bestand was na gebruik gewist en daarom kreeg ik die fout. Het gaat nu prima, zij het dat ik vbTab moest vervangen door Space(2). Met vbTab kwamen er alleen maar symbolen in de list en waren de namen niet te zien.
Op de manier waarop het nu gaat kan ik met de list de database maken. Hartelijk dank voor de assistentie. Ik had daar zelf waarschijnlijk niet uitgekomen. Ik heb geen ervaring met andere bestanden dan met bestanden met tekst of getallen die normaal leesbaar zijn.
Bericht 18 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Jan101477 | Datum | : | 13-11-2007 |
Aan | : | Just Vecht | MsgID | : | 3618.18 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Hallo Just,
Bedankt voor de links. Ik zal ze uitproberen.
Bericht 19 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Michel Uphoff (Sysop) | Datum | : | 13-11-2007 |
Aan | : | Jan101477 | MsgID | : | 3618.19 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Dag Jan,
>> Hoi Michel <<Peter heeft jou daarmee zo goed geholpen, ik niet.
Michel Uphoff (NLcomputer)
Homepage
Bericht 20 van 20NL Computer Forum ~ SQL & Programmeren Van | : | Jan101477 | Datum | : | 13-11-2007 |
Aan | : | Michel Uphoff (Sysop) | MsgID | : | 3618.20 |
Onderwerp | : | Lezen van een spatie-delimited tekstbest | Forum | : | ws-nlcomputer |
Hoi Michel,
Dat is inderdaad waar, maar je hebt toch gereageerd en mij erop gewezen dat ik de oplossing in de verkeerde richting zocht en aangeboden mij verder te helpen indien nodig.
Peter heeft mij echter de complete oplossing gegeven en die werkt prima.