Import file testo

di il
5 risposte

Import file testo

Salve. Access 2010, con VBA importo files di testo con campi delimitati da ";" (di fatto dei csv). Fin qui procedura funzionante.
Alcuni di questi files però hanno dei bug nativi, ovvero alcuni record (righe) sono "spezzati" da un "a capo", cosicchè la prima parte viene persa e l'altra viene letta come se fosse dal 1° campo (un pasticcio!).

L'idea sarebbe, prima dell'importazione:

aprire il file e verificare riga per riga se completa così:

If Len(stringa) - Len(replace(stringa, ";", "") <> 49 Then '(50 campi => 49 separatori attesi)

nuovastringa = replace(stringa, vbCrLf, "")

End If

..in modo da unire le stringhe monche con le rispettive porzioni sottostanti.

Con il metodo Open (prima leggo con Line Input, poi scrivo con Print) mi restituisce un file vuoto o solo l'ultima riga!
Chiedo cortesemente se qualcuno ha già una soluzione e come implemetare correttamente il codice.

5 Risposte

  • Re: Import file testo

    InSalita ha scritto:


    ...Con il metodo Open (prima leggo con Line Input, poi scrivo con Print) mi restituisce un file vuoto o solo l'ultima riga
    Codice completo, non solo una porzione, altrimenti non capiamo come ti muovi tra una riga e l'altra.
  • Re: Import file testo

    Private Sub Prova()

    Dim strLine As String

    Open "C:\Desktop\Prova\Nuovo.txt" For Input As #1

    Do Until EOF(1)

    Line Input #1, strLine

    If Len(strLine) - Len(replace(strLine, ";", "") <> 49 Then '(50 campi => 49 separatori attesi)
    strLine = Replace(strLine, vbCrLf, "")
    End If

    Loop

    Close #1


    Open "C:\Desktop\Prova\Nuovo.txt" For Output As #1

    Print #1, strLine

    Close #1

    End Sub
  • Re: Import file testo

    Co.
    Me dici devi leggere 2 volte il file... Nonostante la strategia sia giusta credo possa essere migliorata....
    Leggi riga per riga e controlli quanti separatori leggi, con il tuo metodo.... se sono meno di 49 leggi la riga dopo e concateni...
    Questo Ionio metterei in un loop all'interno della lettura in modo che se la tua riga fosse spezzata in 2 o 3 la riuscirebbe a ricostruire sempre...
    Quindi 2 cicli uno dentro l'altro... il primo ciclo le righe il secondo interno che continua finché separatori<49
    Se li trova al primo colpo non lo esegue e nella stringa hai la riga, se entra nel loop legge riga successiva, concatena riconta e confronta con 49...

    Sicuramente più performante che leggere 2 volte.

    P.s. potresti anche aprire in modalità Binary in un StringArray... risulta più veloce.
  • Re: Import file testo

    Forse la strategia di fondo è giusta, ma non funziona con il codice da me scritto.
    Non è questione di performances, ma di risultato, ovvero di come ho (malamente) strutturato il metodo Open.
    (riguardo l'ultima osservazione.. sinceramente non ho mai lavorato con StringArray).
    Intanto Grazie!
  • Re: Import file testo

    Come l'hai scritta non può funzionare... togli il vbcrlf ma non concateni quello che viene dopo che fa parte dello stesso record... che si risolve cone ti ho suggerito sopra.

    Per il resto non ho altro da aggiungere le indicazioni sono tutte li ..
Devi accedere o registrarti per scrivere nel forum
5 risposte