Hallo

Welkom, Gast. Alsjeblieft inloggen of registreren.

Recent

204 gasten, 0 leden

Welkom, Gast. Alsjeblieft inloggen of registreren.

28 maart 2024, 15:04:10

Login met gebruikersnaam, wachtwoord en sessielengte

Nieuws

Welkom op het vernieuwde NL Computer Forum!

Auteur Topic: Lezen van een spatie-delimited tekstbestand  (gelezen 13747 keer)

0 leden en 1 gast bekijken dit topic.

Offline NLCOMP

  • Forumheld
  • *****
  • Berichten: 14.666
    • NL Computer Forum
Lezen van een spatie-delimited tekstbestand
« Gepost op: 9 november 2009, 20:18:08 »
Bericht 1 van 20

NL Computer Forum ~ SQL & Programmeren
 Van:Jan101477Datum:10-11-2007
 Aan:AllenMsgID:3618.1
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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 20

NL Computer Forum ~ SQL & Programmeren
 Van:PeterDatum:10-11-2007
 Aan:Jan101477MsgID:3618.2
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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 20

NL Computer Forum ~ SQL & Programmeren
 Van:Jan101477Datum:10-11-2007
 Aan:PeterMsgID:3618.3
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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 20

NL Computer Forum ~ SQL & Programmeren
 Van:Just VechtDatum:10-11-2007
 Aan:Jan101477MsgID:3618.4
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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 20

NL Computer Forum ~ SQL & Programmeren
 Van:Michel Uphoff (Sysop)Datum:10-11-2007
 Aan:Jan101477MsgID:3618.5
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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 20

NL Computer Forum ~ SQL & Programmeren
 Van:PeterDatum:11-11-2007
 Aan:Jan101477MsgID:3618.6
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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 20

NL Computer Forum ~ SQL & Programmeren
 Van:Jan101477Datum:12-11-2007
 Aan:PeterMsgID:3618.7
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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 20

NL Computer Forum ~ SQL & Programmeren
 Van:Jan101477Datum:12-11-2007
 Aan:Just VechtMsgID:3618.8
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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 20

NL Computer Forum ~ SQL & Programmeren
 Van:Jan101477Datum:12-11-2007
 Aan:Michel Uphoff (Sysop)MsgID:3618.9
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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 20

NL Computer Forum ~ SQL & Programmeren
 Van:Jan101477Datum:12-11-2007
 Aan:Just VechtMsgID:3618.10
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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 20

NL Computer Forum ~ SQL & Programmeren
 Van:Stefan de Best (Sysop)Datum:12-11-2007
 Aan:Jan101477MsgID:3618.11
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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 20

NL Computer Forum ~ SQL & Programmeren
 Van:PeterDatum:12-11-2007
 Aan:Jan101477MsgID:3618.12
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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 Variant

Lukt 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 20

NL Computer Forum ~ SQL & Programmeren
 Van:Jan101477Datum:12-11-2007
 Aan:Stefan de Best (Sysop)MsgID:3618.13
 Onderwerp:Lezen van een spatie-delimited tekstbestForum:ws-nlcomputer
Hoi Stefan,
Bedankt voor de link. Daar zijn inderdaad veel bestandsformaten te vinden en dat kan zeker nuttig zijn.


Bericht 14 van 20

NL Computer Forum ~ SQL & Programmeren
 Van:Jan101477Datum:12-11-2007
 Aan:PeterMsgID:3618.14
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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 20

NL Computer Forum ~ SQL & Programmeren
 Van:Just VechtDatum:12-11-2007
 Aan:Jan101477MsgID:3618.15
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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.php
http://www.scintilla.org/SciTE.html
Ze 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 20

NL Computer Forum ~ SQL & Programmeren
 Van:PeterDatum:12-11-2007
 Aan:Jan101477MsgID:3618.16
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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 20

NL Computer Forum ~ SQL & Programmeren
 Van:Jan101477Datum:13-11-2007
 Aan:PeterMsgID:3618.17
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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 20

NL Computer Forum ~ SQL & Programmeren
 Van:Jan101477Datum:13-11-2007
 Aan:Just VechtMsgID:3618.18
 Onderwerp:Lezen van een spatie-delimited tekstbestForum:ws-nlcomputer
Hallo Just,
Bedankt voor de links. Ik zal ze uitproberen.


Bericht 19 van 20

NL Computer Forum ~ SQL & Programmeren
 Van:Michel Uphoff (Sysop)Datum:13-11-2007
 Aan:Jan101477MsgID:3618.19
 Onderwerp:Lezen van een spatie-delimited tekstbestForum:ws-nlcomputer
Dag Jan,
>> Hoi Michel <<
Peter heeft jou daarmee zo goed geholpen, ik niet.

Michel Uphoff (NLcomputer)
Homepage



Bericht 20 van 20

NL Computer Forum ~ SQL & Programmeren
 Van:Jan101477Datum:13-11-2007
 Aan:Michel Uphoff (Sysop)MsgID:3618.20
 Onderwerp:Lezen van een spatie-delimited tekstbestForum: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.