Risultati da 1 a 23 di 23

Discussione: Leggere file di testo di 130 Mb privo di CR ma con LF



  1. #1
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1098
    Versione Office
    2010
    Likes ricevuti
    141
    Likes dati
    1

    Leggere file di testo di 130 Mb privo di CR ma con LF

    Riesco a leggerlo così soltanto la prima volta, poi sono costretto a riavviare excel
    Codice: 
    Sub read_file()
    Dim MyData As String, strData() As String
    Open "F:\download\test1.csv" For Binary As #1 ' <<< modificare percorso
    MyData = Space$(LOF(1))
    Get #1, , MyData
    Close #1
    strData() = Split(MyData, vbLf)
    MyData = ""
    For r = 1 To To UBound(strData)
      Sheets(1).Cells(r + 1, 1) = strData(r - 1)
    Next
    Erase strData
    Sheets(1).Range("A:A").TextToColumns Destination:=Range("A2"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
            :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
            Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _
            ), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array _
            (20, 1), Array(21, 1), Array(22, 1), Array(23, 1)), TrailingMinusNumbers:=True
    Sheets(1).Rows.AutoFit
    End Sub
    domanda 1 : come liberare la memoria per un secondo avvio della macro ? con file piccoli non ho problemi.
    domanda 2 : per poter leggere file di maggiori dimensioni vorrei leggere una riga alla volta, ma non so come fare a causa della mancanza del CR

  2. #2
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1098
    Versione Office
    2010
    Likes ricevuti
    141
    Likes dati
    1

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    ho dimenticato di dire che la seconda volta che avvio la macro ottengo un errore di "Memoria stringa esaurita" (proc 64 bit con 8 Gb di ram)

  3. #3

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1011
    Versione Office
    .
    Likes ricevuti
    364
    Likes dati
    0

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    Ciao,

    visto che non è semplice disporre di un file di testo da 130 MB con le caratteristiche del tuo, dovresti allegarlo.

    P.S.: ovviamente zippato ed eventualmente, se ci sono problemi di dimensioni, lo metti su un server di sharing e fornisci il link.
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  4. #4
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    domanda stupida:
    se devi solo leggerlo, hai provato ad aprirlo con notepad++ ?

    Scossa:

    per la lettura del file, non potrebbe bastare aprirlo in modalità input e, prelevare un carattere alla volta fino a che non si incontra LF oppure fare un replace() di VbLf con VbCrLf?

  5. #5
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    dichiari che il file presenta i fine riga. nei csv, se dico bene sono il delimitatore dei record.

    potresti accedere al file in modalità input pittosto che binary e richiamarne un carattere alla volta per memorizzarlo in una stringa fino all arrivo de LF che determina il record.

    Codice: 
    
    sub
    
    dim testo as string
    dim carattere as string
    open PercorsoNomeFile for input as #1
    
    do until eof(1)
    carattere = input (1,1)
    if ( not carattere = vblr) then ' and (not carattere = vbcr) then
     testo = testo & carattere
    else
    call proceduraPerElaborareIlRecord
     testo = ""
    end if
    loop
    
    close #1 'ricorda di chiudere il file
    end sub

  6. #6
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1098
    Versione Office
    2010
    Likes ricevuti
    141
    Likes dati
    1

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    Citazione Originariamente Scritto da scossa Visualizza Messaggio
    Ciao,

    visto che non è semplice disporre di un file di testo da 130 MB con le caratteristiche del tuo, dovresti allegarlo.

    P.S.: ovviamente zippato ed eventualmente, se ci sono problemi di dimensioni, lo metti su un server di sharing e fornisci il link.

    eccolo www.filedropper.com/test1_7

  7. #7
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1098
    Versione Office
    2010
    Likes ricevuti
    141
    Likes dati
    1

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    Citazione Originariamente Scritto da dracoscrigno Visualizza Messaggio
    domanda stupida:
    se devi solo leggerlo, hai provato ad aprirlo con notepad++ ?
    lo devo anche importare, ma quello non è un problema, comunque non ci perdete troppo tempo, forse ho trovato la soluzione al punto di leggere riga per riga, cosa mi dite invece sul punto di rilasciare la memoria occupata e non dover riavviare Excel ?

    Citazione Originariamente Scritto da dracoscrigno Visualizza Messaggio
    dichiari che il file presenta i fine riga. nei csv, se dico bene sono il delimitatore dei record.

    potresti accedere al file in modalità input pittosto che binary e richiamarne un carattere alla volta per memorizzarlo in una stringa fino all arrivo de LF che determina il record.
    ho trovato in rete una procedura che fa quello che hai detto, apre come binary, legge un buffer e controlla il LF, la collaudo e vi faccio sapere.

  8. #8
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1098
    Versione Office
    2010
    Likes ricevuti
    141
    Likes dati
    1

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    L'obiettivo finale è quello di suddividere il file in 2 fogli perché in seguito potrà superare il milione di righe, questo è il modivo per cui non lo apro direttamente col doppio clic

  9. #9

    L'avatar di Rubik72
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Cosenza
    Età
    45
    Messaggi
    2801
    Versione Office
    Excel 2013
    Likes ricevuti
    1019
    Likes dati
    977

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    Prova con questa routine che scrive ogni milione di record in ogni foglio
    Codice: 
    Sub Test()
    
    
    Dim Stringa As String
    Dim iCount As Long
    Dim ArrStr As Variant
    Dim mySheet As Worksheet
    Dim iSheet As Byte
    
    
    Open "D:\downloads\test1.csv" For Input As #1
    
    
    iSheet = 1
    
    
    Do Until (EOF(1))
        Line Input #1, Stringa
    
    
        iCount = iCount + 1
        If iCount Mod 1000000 = 0 Then
            iSheet = iSheet + 1
            iCount = 1
            Set mySheet = Sheets(iSheet)
        End If
    
    
        ArrStr = Split(Stringa, ";")
        
        For icol = 1 To UBound(ArrStr)
            mySheet.Cells(iCount, icol) = ArrStr(icol - 1)
        Next
        
    Loop
    
    
    Close #1
    End Sub
    P.S. Non l'ho testata

  10. #10
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1098
    Versione Office
    2010
    Likes ricevuti
    141
    Likes dati
    1

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    Grazie rubik, ma Line Input ha bisogno del CRLF alla fine della riga e col mio file non funziona, ho risolto nel modo seguente, naturalmente son ben accette soluzioni più semplici
    Codice: 
    Sub leggi__csv() ' con VBLF Dim s As String, strData() As String
    numrighe = 400000
    Open "F:\download\test1.csv" For Binary As #1 ' <<< modificare percorso
    r = 2
    n = 1
    Do While Not EOF(1)
     s = GetLineInput("1")
      Sheets(n).Cells(r, 1) = s
      r = r + 1
      If r > numrighe Then
        r = 1
        n = n + 1
        If n = 3 Then Exit Do
      End If
    Loop
    Close #1
    
    Sheets(1).Range("A:A").TextToColumns Destination:=Range("A2"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=True, Comma:=False, Space:=False, Other:=False, TrailingMinusNumbers:=True
    Sheets(1).Rows.AutoFit
    Sheets(2).Range("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=True, Comma:=False, Space:=False, Other:=False, TrailingMinusNumbers:=True
    Sheets(2).Rows.AutoFit
    End Sub
    
    Public Function GetLineInput(ByVal FileHandle As String) As String ' intercetta VBLF
      Static Buffer As String, Temp As String, i As Long
    
      If EOF(FileHandle) And Buffer = "" Then
         Error.Raise 1000, "GetLineInput", "End of File."
      End If
      ' Find the First vbLf or vbCrLf
      i = InStr(Buffer, vbLf)
      ' If it's not in the buffer, read more file.
      Do While i = 0 And Not EOF(FileHandle)
         Temp = String(8192, 0)
         Get #FileHandle, , Temp
         Buffer = Buffer & Temp
         i = InStr(Buffer, vbLf)
      Loop
      ' If vbLf is not found then this must be the last line.
      If i = 0 Then
         GetLineInput = Buffer
         Buffer = ""
      Else
         ' Check if there is also a vbCr and adjust accordingly.
         If Mid$(Buffer, i - 1, 1) = vbCr Then
            GetLineInput = Left$(Buffer, i - 2)
         Else
            GetLineInput = Left$(Buffer, i - 1)
         End If
         Buffer = Right$(Buffer, Len(Buffer) - i)
      End If
    End Function

  11. #11

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1011
    Versione Office
    .
    Likes ricevuti
    364
    Likes dati
    0

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    Ciao a tutti,

    finalmente ho avuto un po' di tempo e, partendo dai codici già postati, sono riuscito ad eliminare i bug presenti ed a mettere inseme un codice funzionante, presumo per qualsiasi dimensione di file .csv (sicuramente per quello con 663.333 righe che ha messo a disposizione patel).

    In pratica, si tratta di leggere il file csv dividendolo ogni 1.000.000 di righe su un foglio diverso.
    Inoltre, ogni 25.000 righe (ma potrebbero anche essere 50.000 o 100.000 cambia poco) applico il metodo .TextToColumns. per non impegnare la macchina con range troppo ampi.
    Sulla mia vecchia macchina impiega 18 secondi circa ogni 25.000 righe (100.000 righe in 72 secondi, 663.333 in circa 9 minuti).

    Questi i due codici da mettere in un modulo standard (cambiate il path ed il nome del file .csv a vostro uso):


    Codice: 
    Codice: 
    Sub read_file()
      Dim strData As String
      Dim nChunck As Long
      Dim j As Long
      Dim nFirstRow As Long, nLastRow As Long
      Dim wb As Workbook
      Dim ws As Worksheet
      Dim nStart As Single
      Dim nStop As Single
      Const nRowsBlock As Long = 25000
      
      nStart = Timer
      On Error GoTo safety_exit_
      Set wb = ThisWorkbook
      Application.ScreenUpdating = False
      nChunck = 1
      Application.StatusBar = "...elaborazione in corso ..... "
      With wb.Worksheets
        Set ws = .Add
        ws.Move after:=.Item(.Count)
        ws.Name = "Chunck_" & nChunck
      End With
      j = 0
      Open ThisWorkbook.Path & "\TEST1.csv" For Binary As #1
      nFirstRow = 1
      nLastRow = 0
      Application.DisplayAlerts = False
      Debug.Print GetLineInput("1", 1)
      Do While 1
        If nLastRow = 1000000 Then
          nChunck = nChunck + 1
          With wb.Worksheets
            Set ws = .Add
            ws.Move after:=.Item(.Count)
            ws.Name = "Chunck_" & nChunck
          End With
          ThisWorkbook.Worksheets("Chunck_1").Range("A:A").Copy ws.Range("A1")
          nFirstRow = 2
          nLastRow = 1
        End If
        strData = GetLineInput("1", 0)
        If Left(strData, 1) <> Chr(0) Then
          j = j + 1
          nLastRow = nLastRow + 1
          ws.Range("A" & nLastRow).Value = strData
          If j = nRowsBlock Or EOF(1) Then
            ws.Range("A" & nFirstRow & ":A" & nLastRow).TextToColumns Destination:=ws.Range("A" & nFirstRow), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
            :=Array(Array(1, 2), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
            Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _
            ), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array _
            (20, 1), Array(21, 1), Array(22, 1), Array(23, 1)), TrailingMinusNumbers:=True
            Application.StatusBar = "...elaborate " & nLastRow + (nChunck - 1) * 1000000 & " righe in " & Timer - nStart & " secondi ...."
            'nChunck = nChunck + 1
            nFirstRow = nLastRow + 1
            j = 0
          End If
        End If
        If EOF(1) And Left(strData, 1) = Chr(0) Then
          Exit Do
        End If
        DoEvents
      Loop
      ws.Range("A:W").Columns.AutoFit
    safety_exit_:
      nStop = Timer
      Application.DisplayAlerts = True
      Debug.Print GetLineInput("1", 1)
      Close #1
      Application.ScreenUpdating = True
      Application.StatusBar = False
      Set ws = Nothing
      Set wb = Nothing
      If Err.Number <> 0 Then
        Close #1
        MsgBox Err.Description
      Else
        MsgBox "finito in " & nStop - nStart
      End If
     
    End Sub


    Codice: 
    Public Function GetLineInput(ByVal FileHandle As String, Optional ByVal bReset As Boolean = 0) As String ' intercetta VBLF
      Static Buffer As String, Temp As String, i As Long
    
    
      If bReset Then
        Buffer = ""
        GetLineInput = Buffer
      Else
        If EOF(FileHandle) And Buffer = "" Then
           Err.Raise 1000, "GetLineInput", "End of File."
        End If
        ' Find the First vbLf or vbCrLf
        i = InStr(Buffer, vbLf)
        ' If it's not in the buffer, read more file.
        Do While i = 0 And Not EOF(FileHandle)
           Temp = String(8192, 0)
           Get #FileHandle, , Temp
           Buffer = Buffer & Temp
           i = InStr(Buffer, vbLf)
        Loop
        ' If vbLf is not found then this must be the last line.
        If i = 0 Then
           GetLineInput = Buffer
           Buffer = ""
        Else
           ' Check if there is also a vbCr and adjust accordingly.
           If Mid$(Buffer, i - 1, 1) = vbCr Then
              GetLineInput = Left$(Buffer, i - 2)
           Else
              GetLineInput = Left$(Buffer, i - 1)
           End If
           Buffer = Right$(Buffer, Len(Buffer) - i)
        End If
      End If
    End Function
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  12. #12
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1098
    Versione Office
    2010
    Likes ricevuti
    141
    Likes dati
    1

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    Grazie scossa, funziona anche se la mia ultima impiega 1/3 del tempo della tua. A parte la creazione dei fogli necessari quali erano i bugs ? ho visto che hai anche modificato la function, perché ?

  13. #13

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1011
    Versione Office
    .
    Likes ricevuti
    364
    Likes dati
    0

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    Ciao,
    Citazione Originariamente Scritto da patel Visualizza Messaggio
    A parte la creazione dei fogli necessari quali erano i bugs ? ho visto che hai anche modificato la function, perché ?
    Perché non venivano scritte le ultime righe del file (l'ultimo Buffer, essendo EOF(1) vero, non veniva elaborato).
    Oltretutto essendo la variabile Buffer statica, se il codice si interrompe la variabile resta piena e, rilanciando il codice, il risultato si sfalsava.

    Comunqe secondo me, avrebbe più senso aprire il file .csv con notepad++, dal menu Modifica selezionare Converti carattere di fine linea -> formato Windows.
    In meno di un minuto converte il file di 663.333 righe.
    Quindi puoi leggerlo da Excel direttamente (ignorando gli alert) oppure da VBA line by line, col codice sotto riportato, in meno 1 minuto e mezzo.

    Codice: 
    Sub read_CSV()
      Dim fileName As String, textData As String, textRow As String
      Dim fileNo As Integer, j As Long, nRows As Long
      Dim aRows As Variant, aFull As Variant
      Dim nLB As Long, nUB As Long
      Dim k As Long
    
      Dim strData As String
      Dim nChunck As Long
      Dim nFirstRow As Long, nLastRow As Long
      Dim nRowIndx As Long
      Dim wb As Workbook
      Dim ws As Worksheet
      Dim nStart As Single
      Dim nStop As Single
      Const nRowsBlock As Long = 25000
      Const nRowsSheet As Long = 1000000
      
      nStart = Timer
      Set wb = ThisWorkbook
      Application.ScreenUpdating = False
      nChunck = 1
      Application.StatusBar = "...elaborazione in corso ..... "
      On Error GoTo safety_exit_
    
      With wb.Worksheets
        Set ws = .Add
        ws.Move after:=.Item(.Count)
        ws.Name = "Chunck_" & nChunck
      End With
     
      fileName = wb.Path & "\TEST3_crnl.csv"
      fileNo = FreeFile 'Get first free file number
      Open fileName For Input As #fileNo
      Do While Not EOF(fileNo)
        nRows = nRows + 1
        Line Input #fileNo, textRow
      Loop
      Close #fileNo
      With Application
        .StatusBar = "...elaborazione di " & nRows & " righe in corso ..... "
        ReDim aRows(1 To .Min(nRows, nRowsSheet), 1 To 1)
      End With
      fileNo = FreeFile 'Get first free file number
      Open fileName For Input As #fileNo
      k = 1
      nFirstRow = 0
      nLastRow = 0
      Do While Not EOF(fileNo)
        j = j + 1
        nLastRow = nLastRow + 1
        Line Input #fileNo, textRow
        aRows(nLastRow, 1) = textRow
        DoEvents
        If nLastRow = UBound(aRows) Then
          ws.Range("A" & k & ":A" & nLastRow) = aRows
          For nFirstRow = k To nLastRow Step nRowsBlock
            DoEvents
            ws.Range("A" & nFirstRow & ":A" & nFirstRow + nRowsBlock - 1).TextToColumns Destination:=ws.Range("A" & nFirstRow), DataType:=xlDelimited, _
              TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
              Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
              :=Array(Array(1, 2), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
              Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _
              ), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array _
              (20, 1), Array(21, 1), Array(22, 1), Array(23, 1)), TrailingMinusNumbers:=True
            Application.StatusBar = "...elaborate " & Application.Min(nRows, (nFirstRow + nRowsBlock - 1) + (nChunck - 1) * nRowsSheet) & " righe, elaborazione delle successive in corso ..... "
          Next
          ws.Range("A1:W" & nLastRow).Columns.AutoFit
          If Not EOF(fileNo) Then
            ReDim aRows(1 To Application.Min(nRows - nRowsSheet * nChunck, nRowsSheet), 1 To 1)
            With wb.Worksheets
              nChunck = nChunck + 1
              Set ws = .Add
              ws.Move after:=.Item(.Count)
              ws.Name = "Chunck_" & nChunck
              ws.Range("1:1").Value = wb.Worksheets("Chunck_1").Range("1:1").Value
            End With
            k = 2
            nFirstRow = 0
            nLastRow = 0
          End If
        End If
      Loop
      Close #fileNo
    safety_exit_:
      nStop = Timer
      Debug.Print nStart
      Debug.Print nStop
      Debug.Print nStop - nStart
      Close #fileNo
      If VarType(aRows) = vbArray + vbVariant Then Erase aRows
      Application.DisplayAlerts = True
      Application.ScreenUpdating = True
      Application.StatusBar = False
      Set ws = Nothing
      Set wb = Nothing
      If Err.Number <> 0 Then
        Close #fileNo
        MsgBox Err.Description
      Else
        MsgBox "finito in " & nStop - nStart & " secondi"
      End If
     
    End Sub
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  14. #14
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1098
    Versione Office
    2010
    Likes ricevuti
    141
    Likes dati
    1

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    Citazione Originariamente Scritto da scossa Visualizza Messaggio
    Perché non venivano scritte le ultime righe del file (l'ultimo Buffer, essendo EOF(1) vero, non veniva elaborato).
    Oltretutto essendo la variabile Buffer statica, se il codice si interrompe la variabile resta piena e, rilanciando il codice, il risultato si sfalsava..
    grazie, non me ne ero accorto
    Comunqe secondo me, avrebbe più senso aprire il file .csv con notepad++, dal menu Modifica selezionare Converti carattere di fine linea -> formato Windows.
    In meno di un minuto converte il file di 663.333 righe.
    anche con Wordpad, basta aprire e salvare, ma così è troppo facile e non si impara nulla ;-)

    Perché hai aggiunto un parametro alla funzione ?

  15. #15
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1098
    Versione Office
    2010
    Likes ricevuti
    141
    Likes dati
    1

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    Citazione Originariamente Scritto da patel Visualizza Messaggio
    Perché hai aggiunto un parametro alla funzione ?
    domanda inutile, mi ha già risposto prima

  16. #16
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1098
    Versione Office
    2010
    Likes ricevuti
    141
    Likes dati
    1

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    quello che non riesco a spiegarmi è il tempo di esecuzione della tua soluzione, il triplo della mia (a parte il fatto che non legge tutto il file)

  17. #17

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1011
    Versione Office
    .
    Likes ricevuti
    364
    Likes dati
    0

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    Citazione Originariamente Scritto da patel Visualizza Messaggio
    quello che non riesco a spiegarmi è il tempo di esecuzione della tua soluzione, il triplo della mia (a parte il fatto che non legge tutto il file)
    Beh, c'è un bel po' di codice in più nel mio ciclo Do while ... loop, oltre a DoEvents ci sono un po' di If per verificare se è necessario aggiungere un foglio, se EOF() è vero ma ci sono ancora righe da scrivere; nel mio, per evitare problemi di memoria esaurita ogni 25.000 righe richiamo il metodo .TextToColumns .....
    Diciamo che è il prezzo da pagare per avere una maggiore solidità.
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  18. #18
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1098
    Versione Office
    2010
    Likes ricevuti
    141
    Likes dati
    1

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    io l'ho provato impostando 400000 righe per foglio ed anche per TextToColumns ed il tempo non cambia, però nel secondo foglio, nonostante le righe totali siano circa 600000 riempie la colonna A con 400000 dati

  19. #19
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    non son riuscito a seguiro tutto il discorso per motivi di tempo... anche di carattere :D :D
    però ho fatto due cose:

    ho creato un file csv da 360 mega ed ho tentato di apritlo con excel.

    il tempo è stato lungotto; una trentina di secondi.

    al che ho aperto anche il file di test da 130.
    ho ricevuto da excel due messaggi di errore che ho scoperto esser correggibili mettendo un apostrofo nella prima cella come consigliato da microsof ed ora si apre tranquillamente anche se con i soliti trenta secondi o poco meno.

    arrivati a questo punto mi stavo chiedendo:
    ma il problema è il tempo di elaborazione per aprire il file. oppure c è anche altro che mi sono perso?

  20. #20
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1098
    Versione Office
    2010
    Likes ricevuti
    141
    Likes dati
    1

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    1) il file da leggere ha le righe delimitate solo da LF (tipo unix)
    2) il file potrebbe assumere più di un milione di righe e quindi non entrare in un unico foglio
    3) il tempo di elaborazione è sempre importante ma non vitale.
    il file che hai creato ntu quante righe ha ? sono delimitate solo da LF ?

  21. #21
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1098
    Versione Office
    2010
    Likes ricevuti
    141
    Likes dati
    1

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    scossa, perché hai inserito il doevents ? funziona anche senza ed il tempo si riduce di parecchio, però occorre eliminare il msgbox (non so perché) e sostituirlo con un debug.print

  22. #22
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2074
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    Citazione Originariamente Scritto da patel Visualizza Messaggio
    1) il file da leggere ha le righe delimitate solo da LF (tipo unix)
    ...
    prendi il tuo file da 130 mega.
    Aprilo con un notepad.
    aggiungi, come primo carattere di apostrofo (') per ovviare ad alcuni problemi descritti da microsoft per i csv che cominciano con alcuni caratteri (non ricordo il link )

    Salva e chiudi
    apri il file con Excel, attendendo quello che devi attendere.
    salva con nome e scegliendo CSV (i ritorni a capo ce li mette excel.

    Ora hai un file di 130 mega con CrLf

  23. #23
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    1098
    Versione Office
    2010
    Likes ricevuti
    141
    Likes dati
    1

    Re: Leggere file di testo di 130 Mb privo di CR ma con LF

    @Draco
    questa cosa la si può ottenere anche aprendolo con wordpad (senza aggiungere niente) e risalvandolo.
    Ovviamente utilizzando un file con i CRLF è tutto più semplice, ma la curiosità di capire come lavorare con gli LF ha preso il sopravvento

    @ scossa
    basta un solo doevents prima del msgbox

  24. I seguenti utenti hanno dato un "Like"


Discussioni Simili

  1. Leggere dati da sql server e creare un elenco
    Di svipla nel forum Domande su Excel VBA e MACRO
    Risposte: 7
    Ultimo Messaggio: 20/01/17, 10:14
  2. leggere penultima linea di file word da excel
    Di patel nel forum Domande su Excel VBA e MACRO
    Risposte: 17
    Ultimo Messaggio: 05/09/16, 20:10
  3. Confronta testo in colonne di file diversi
    Di Morric nel forum Domande su Excel in generale
    Risposte: 10
    Ultimo Messaggio: 07/07/16, 10:42
  4. stampare il risultato su un file testo
    Di solenero nel forum Domande su Excel VBA e MACRO
    Risposte: 1
    Ultimo Messaggio: 15/05/16, 00:55
  5. Programma per far leggere ad Excel letture codi a barre
    Di nick715 nel forum Domande su Excel in generale
    Risposte: 3
    Ultimo Messaggio: 11/04/16, 23:01

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •