[vb] bestanden inlezen: newline en rare tekens

Pagina: 1
Acties:

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Ik heb 2 probleempjes met het inlezen van bestanden.
Maar, zal eerst m'n (relevante) code ff geven:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
Open thisFile For Input As #1
    While Not EOF(1)
        Input #1, thisLine
        If (Left(thisLine, 3) = "URL") Then
            thisContent = "|BKMRK|" & getFileName(thisFile) & "||" & Right(thisLine, (Len(thisLine) - 4))
            If curPath <> "" Then
                thisContent = curPath & thisContent
            End If
            fsoStream.WriteLine (thisContent)
        End If
    Wend
Close #1


Ik ben pas net met VB begonnen dus misschien maak ik wel een onwijze domme fout, maargoed, wat de code doet: hij maakt onderdeel uit van een functie die een directorie scant en daabij ieder bestand inleest dat op .url eindigd (een bookmark file dus). Zo'n bestand bekijkt ie regel voor regel en als het begin met 'URL' begint, dan schrijf ik die url weg in een output file (met nog wat extra opmaak erbij)

Opzich werkt dit allemaal aardig er gaan alleen 2 dingen fout
1. sommige van die url bestanden pakt ie ipv per regel alle regels gelijk. Terwijl het toch echt afzonderlijke regels zijn. Ik ben al een tijdje aan het klooien en heb dit o.a. ook in python en php zitten programmeren (sommige zullen wel denken, heb je hem ook weer :) ) en die hadden met dezelfde bestanden geen problemen om het per regel in te lezen. Ik heb al wat zitten zoeken, maar kon niet vinden hoe ik dit zou kunnen veranderen zodat ie het wel bij alle bestanden per regel doet.
2. een vriend van me ging dit testen en hij liep stuk op een paar russische bookmarks. Ik heb die fout wel weten te omzeilen door te chekcen of ik de filename kan uitlezen en zo niet dan probeert het bestand ook niet te openen - dan worden de russiche bookmarks geskipped en krijg je geen foutmelding. Maar het liefste zou ik ze gewoon wel uit willen lezen want er staat wel een bookmark in.

  • Kix@$$
  • Registratie: December 2001
  • Laatst online: 21-08 15:33
Probeer i.p.v. Input #1 eens Line Input #1. Hierbij pakt hij de hele regel tot aan de <crlf>, dus ook met komma's er tussen e.d.

Tip: Probeer i.pv. een bestand een vast nummer te geven, met FreeFile een nummer op te vragen voor een bestandsnummer dat nog niet in gebruik is. Zet deze in een variabele en gebruik die bij je bestands-gebruik.

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Kix@$$ schreef op 18 August 2003 @ 19:02:
Tip: Probeer i.pv. een bestand een vast nummer te geven, met FreeFile een nummer op te vragen voor een bestandsnummer dat nog niet in gebruik is. Zet deze in een variabele en gebruik die bij je bestands-gebruik.
Aha...ben even gaan googlen en begrijp dat je op die manier altijd een nog niet gebruikt nummer krijgt? Bedankt voor de tip.
Probeer i.p.v. Input #1 eens Line Input #1. Hierbij pakt hij de hele regel tot aan de <crlf>, dus ook met komma's er tussen e.d.
Zelfde resultaat helaas. Werkt ook dus ook niet

  • Kix@$$
  • Registratie: December 2001
  • Laatst online: 21-08 15:33
Mja als de tekst die je ophaald Unicode text is met je eerst een dll aanroepen om het om te zetten naar OEM(?) text dacht ik. Visual Basic kan volgens mij zo 1,2,3 geen unicode aan.

Wat mischien het verschil zou kunnen zijn met de regels is dat er geen <crlf> staat (character 13 & 10) maar alleen een <cr> of <lf> ofzo. Dan breekt hij de regel daar volgens mij niet op af. Je zou dan zelf moeten zoeken naar het einde.

Om even een voorbeeld te geven met FreeFile:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim intFile as Integer

intFile = FreeFile

Open thisFile For Input As #intFile
    While Not EOF(intFile)
        Input #intFile, thisLine
        If (Left(thisLine, 3) = "URL") Then
            thisContent = "|BKMRK|" & getFileName(thisFile) & "||" & Right(thisLine, (Len(thisLine) - 4))
            If curPath <> "" Then
                thisContent = curPath & thisContent
            End If
            fsoStream.WriteLine (thisContent)
        End If
    Wend
Close #intFile

[ Voor 42% gewijzigd door Kix@$$ op 18-08-2003 20:01 ]


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Kix@$$ schreef op 18 August 2003 @ 19:59:
Mja als de tekst die je ophaald Unicode text is met je eerst een dll aanroepen om het om te zetten naar OEM(?) text dacht ik. Visual Basic kan volgens mij zo 1,2,3 geen unicode aan.
Dat slaat op die russiche-bookmarks files? (bedenk me nu dat het stom was 2 vraen in hetzelfde topic te stellen. moet ik niet doen...)
Het probleem is niet de code die in de file staat, maar hij vindt het bestand gewoon niet. Ik loop overigens gewoon in windows tegen hetzelfde probleem aan. Als ik het bestand wil verwijderen zegt ie 'bestand niet gevonden'. Ik krijg ze alleen verwijderd als ik het via het Favorieten-beheer in IE doe.
Wat mischien het verschil zou kunnen zijn met de regels is dat er geen <crlf> staat (character 13 & 10) maar alleen een <cr> of <lf> ofzo. Dan breekt hij de regel daar volgens mij niet op af. Je zou dan zelf moeten zoeken naar het einde.
Daar was ik al bang voor. Maar Visual Basic heeft voor de meest obscure dingen wel functies, dus vermoedde dat hier ook wel een standaard oplossing voor was, vandaar dat ik het vroeg. Kon me niet voorstellen dat je met iets simpels als een regeleinde bepalen nog zelf moest gaan klooien...maar wel dus...
Om even een voorbeeld te geven met FreeFile:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim intFile as Integer

intFile = FreeFile

Open thisFile For Input As #intFile
    While Not EOF(intFile)
        Input #intFile, thisLine
        If (Left(thisLine, 3) = "URL") Then
            thisContent = "|BKMRK|" & getFileName(thisFile) & "||" & Right(thisLine, (Len(thisLine) - 4))
            If curPath <> "" Then
                thisContent = curPath & thisContent
            End If
            fsoStream.WriteLine (thisContent)
        End If
    Wend
Close #intFile
Ja, sorry, was ik vergeten te melden, had m'n code al gelijk aangepast. Had met google een voorbeeld gevonden, dus was geen probleem. Het enige verschil is dat ik #intF ipv #intFile heb :)

p.s. ik ga dus zelf wel een functie proberen te maken die die regeleindes wel goed bepaalt. Maar dan zit ik dus nog met die russische-bookmarks files - weet iemand daar misschien een oplossing voor?
Voor degene die nieuwsgierig zijn, hier is een voorbeeld van een url die problemen geeft:
http://www.artlebedev.ru/studio/posters/
maar daar maar eens een bookmark van en probeer die vervolgens maar eens te verwijderen met explorer ofzo.

[ Voor 13% gewijzigd door marty op 18-08-2003 20:20 ]


  • Kix@$$
  • Registratie: December 2001
  • Laatst online: 21-08 15:33
Maar hoe zoek je die bestanden dan op die in die directory staan? Met Dir() of ..?

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Kix@$$ schreef op 18 augustus 2003 @ 20:23:
Maar hoe zoek je die bestanden dan op die in die directory staan? Met Dir() of ..?
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
file_name = Dir(sPathToGet & "\*.*", vbNormal Or vbDirectory)
        
Do While Len(file_name) > 0
    If (file_name <> "..") And (file_name <> ".") Then
        ' add to the collection
        files.Add sPathToGet & "\" & file_name
    End If
    
    file_name = Dir()   ' is there anything left?
    DoEvents        ' allow other processes to happen
Loop


ik gooi dus eerst alles in file_name en loop daar weer doorheen en voeg het path aan de files toe. Daar loop ik dan later nog een keer doorheen en lees ze in met de eerder gegeven code.
Ik moet zeggen, dit heeft mij ook enigzins verbaasd - dat ie ze dus wel vindt. Maar als ik in windows kijk naar zo'n bestand dan ziet windows 'm ook rustig, geeft zelfs aan hoe groot het bestand is enzo - maar zodra je er wat mee wil doen (in notepad openen of verwijderen) dan kan ie het bestand ineens niet meer vinden. Dus wat dat betreft klopt het wel weer.
Toch moet er een manier zijn want ie kan ze kennelijk wel verwijderen en inlezen...

  • Kix@$$
  • Registratie: December 2001
  • Laatst online: 21-08 15:33
Ik denk dat dit niet zo met standaard VB gaat lukken.
Als je een russishe site hebt en dat opslaag staat hij de bestandsnaam op in unicode. Dit kan VB (volgens mij) niet.
Wat je zou kunnen proberen is ipv Dir() een dll aan te roepen om de filelisting van een directorie te krijgen, maar die informatie moet je in een string kwijt. Die string kan volgens mij ook geen unicode aan en krijg je alleen blokjes.

Dit weet ik alleen niet zeker.
Pagina: 1