Bypassare un error 14



  • Bypassare un error (14)
    di Mario-xar (utente non iscritto) data: 18/12/2012 22:49:18

    Ciao a tutti, mi trovo impelagato in una noiosissima guerra contro un file da 1.2Gb con le seguenti caratteristiche:
    48000000 righe separate fra di loro non da un comodo chr(13) o chr(13)+chr(10) ma dal solo chr(10).
    Il risultato è che il comando line input non carica la riga fino al chr(10) ma tenta, ovviamente senza riuscirci, di caricarsi una singola riga da 1.2G che come preannunciato nel titolo finisce con un bel error (14)...
    Ho provato a frugare in lungo ed in largo, ma senza risultati, alla ricerca di un sistema per importare una riga per volta con queste condizioni.
    Se potessi importare la riga per intero poi con un replace() sistemerei la questione per poter usare line input, ma si torna al problema precedente...quindi:
    Qualcuno conosce un modo per risolvere questa noiosa situazione????
    saluti!

    ps. excel 2007 - win7



  • di Vecchio Frac data: 18/12/2012 23:04:56

    Carina questa ^_^
    Un singolo enorme file di testo? o codifiche strane da trattare con Open ... For Binary? o For Input alla meno peggio?
    O anche: FileSystemObject e ReadLine o ReadAll.
    La butto lì, domani guardo meglio.





  • di Vecchio Frac data: 19/12/2012 09:17:01

    La risposta mi interessa... è un singolo file di testo?
    Ora tento di creare un piccolo file con le caratteristiche specificate (un line feed come terminatore di riga).
    Certo che è strano solo un line feed senza carriage return.
    Nelle vecchie macchine da scrivere sarebbe come andare a capo ma sulla stessa riga, e lì ricominciare a scrivere ^_^





  • di Mario-xar (utente non iscritto) data: 19/12/2012 11:57:22

    Ehh, simpatico vero?
    Si il discorso è ceh se lo apri con un....bah....textpad i dati risultano incolonnati....ma la realtà (macchina) è ben diversa, pensa: una singola riga da 1.2G O_o ingestibile...
    Volevo splittare il file in 3-4 pezzi così da poter caricare la singola riga, modificarla a dovere e poi riattaccare i pezzi insieme.
    Altra cosa, cercavo un qualche software a basso livello per sostituire il chr(10) con chr(13) ma non mi riesce di trovarne uno...ma vorrei, anche per uan questione di principio, provare a risolvere tutto DENTRO vba.
    L'alternativa ultima è che torni ai (purtroppo) pochi rudimenti che ho di C++ e mi scriva il programmino per sostituire i caratteri con quello...
    Ma sento che c'è una risposta la fuori !!! Qualcuno sa cosa fare!!!
    BTW, se mi lasci un indirizzo ti posso spedire una porzione del file reale.



  • di Vecchio Frac (utente non iscritto) data: 19/12/2012 14:13:49

    Ho visto il messaggio privato con l'allegato, sembra il tracciato di un DNA ^_^
    Immagino che Textpad non "tenga" un file con oltre quaranta milioni di righe... figurati Excel :)
    Si potrebbe anche importare il file in Word e fargli fare un salvataggio come testo.

    Per lavorare ho ricreato un file con CHR(10) a fine riga.
    Proviamo il codice che ti allego; naturalmente devi adattare i nomi dei file eccetera, non te lo dico neanche per non offenderti.
    Dalle mie prove dovrebbe funzionare, fai sapere.



     
    Sub import()
    Dim my_file As String, s As String, fso As Object, f As Object
        
        my_file = "path & filename here.txt"    ' <-- qui inserire il percorso e nome di file da cui leggere i dati
        
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set f = fso.OpenTextFile(my_file, 1, False)     '1 = ForReading
        
        s = Replace(f.readall, Chr(10) + Chr(13) + Chr(10), vbCrLf)
        
        f.Close
        
        Open "path & 	est2.txt" For Output As #1       ' <-- qui inserire un percorso e nome di file di testo di prova
        Print #1, s
        Close #1
        
        MsgBox "Fatto."
    
    End Sub



  • di Mario-xar (utente non iscritto) data: 19/12/2012 14:48:22

    Soluzione molto interessante, purtroppo all'operazione replace() occorre un errore di run-time '7': memoria esaurita...
    E se lo aprissi in Binary e lo ispezionassi byte per byte? con Get mi pare...ahh...provo...



  • di Vecchio Frac data: 19/12/2012 15:01:46

    Molto bene, allora proviamo questa variante che usa Replace non sull'intero stream ma soltanto su una riga per volta. Questo non dovrebbe dare problemi di sorta.
    Ho guardato anch'io se e come utilizzare For Binary, ma credo che fso sia più flessibile (eh, non siamo in python purtroppo ^_^).
     
    Sub import()
    Dim my_file As String, s As String, fso As Object, f As Object
        
        my_file = "path & filename here.txt"    ' <-- qui inserire il percorso e nome di file da cui leggere i dati
        
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set f = fso.OpenTextFile(my_file, 1, False)     '1 = ForReading
        
        Open "path & 	est2.txt" For Output As #1       ' <-- qui inserire un percorso e nome di file di testo di prova
        
        Do While f.AtEndOfStream <> True
            s = f.ReadLine
            If Trim(s) <> "" Then Print #1, Replace(s, Chr(10) + Chr(13) + Chr(10), vbCrLf)
        Loop
        
        f.Close
        
        Close #1
        
        MsgBox "Fatto."
    
    End Sub






  • di Mario-xar (utente non iscritto) data: 19/12/2012 17:08:36

    Ottimo! Ha funzionato molto bene, in 7' e 41" ha fatto quanto richiesto! Grazie a Vecchio Frac!
    Giusto per dovere di cronoca ero arrivato alla conclusione di cui sotto, che funziona ma si prende decisamente più tempo.
    Son soddisfazione eh

     
    Sub EliminaLF()
        Dim Fname, FN$, Data$
        Dim count£
        Dim T1 As Date
        
        Data = Chr(32)   
        Debug.Print "-Start "; Data; Time; " -"
        Close
        Fname = Application.GetOpenFilename()
        If Fname = False Then Exit Sub  
        FN = Fname & "-SENZA-LF-.ped"    
        T1 = Time
        Open Fname For Binary Access Read As #1
        Open FN For Binary Access Write As #2   
        Do Until EOF(1)
            Get #1, , Data
            If Data = Chr(10) Then
                Data = Chr(13)
                count = count + 1
            End If
            'Debug.Print Data; Asc(Data)
            Put #2, , Data
        Loop   
        Close
        Debug.Print Durata(T1, Time), count
        Debug.Print "-end-"
    End Sub



  • di Vecchio Frac data: 19/12/2012 19:32:32

    Immagino che leggere e scrivere a colpi di byte alla volta ci metta un tantinello di più, soprattutto se parli di oltre un miliardo di byte ^_^
    Ho fatto un salto sulla sedia a vedere le dichiarazioni come
    Dim Fname, FN$, Data$
    Dim count£
    ...non le usavo più dal tempo del QuickBasic (ehm... 1989) ^_^

    Sono contento di esserti stato utile.