Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Visual Basic 6 - Limite riga file csv
Forum - Visual Basic 6 - Limite riga file csv

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
gvigliani (Normal User)
Pro


Messaggi: 106
Iscritto: 30/12/2006

Segnala al moderatore
Postato alle 13:20
Sabato, 05/01/2013
Ciao a tutti,
devo leggere un file . csv che è su un sito e scaricarlo sul mio pc. Fin qui tutto bene.
Il problema nasce dal fatto che , mentre se carico questo file all'interno di Excel è giustamente tagliato al termine di ogni riga,  se lo leggo tramite il Line Input del Visual Basic mi legge il file per intero e non per riga.
Faccio un esempio:
In Excel il file mi viene letto cosi':

EVENT_ID,MENU_HINT,EVENT_NAME,EVENT_DT,SELECTION_ID,SELECTION_NAME,WIN_LOSE,BSP,PPWAP,MORNINGWAP,PPMAX,PPMIN,IPMAX,IPMIN,MORNINGTRADEDVOL,PPTRADEDVOL,IPTRADEDVOL
107845418,GB / Wolv 4th Jan,1m Hcap,04-01-2013 12:00,308730,Beautiful Day,1,9.465853480843236,10.1019838964027616854660071743601306771,11.1278950048089779424753841433470277118,14.5,9,11.5,1.01,4326.1,29479.56,60879.1810

Mentre se lo leggo con un Line Input con Vb6 mi si presenta così:

EVENT_ID,MENU_HINT,EVENT_NAME,EVENT_DT,SELECTION_ID,SELECTION_NAME,WIN_LOSE,BSP,PPWAP,MORNINGWAP,PPMAX,PPMIN,IPMAX,IPMIN,MORNINGTRADEDVOL,PPTRADEDVOL,IPTRADEDVOL107845418,GB/Wolv 4th Jan,1m Hcap,04-01-2013 12:00,308730,Beautiful Day,1,9.465853480843236,10.1019838964027616854660071743601306771,11.1278950048089779424753841433470277118,14.5,9,11.5,1.01,4326.1,29479.56,60879.18
10

In pratica Vb6 non legge il termine della riga.

Ho provato ancjhe ad usare  l' Input classico ma all'ultimo valore somma il primo della riga successiva:

IPTRADEDVOL107845418

Il bello è che facendo un copia incolla dal file , tutte le righe sono perfettamente separate:

EVENT_ID,MENU_HINT,EVENT_NAME,EVENT_DT,SELECTION_ID,SELECTION_NAME,WIN_LOSE,BSP,PPWAP,MORNINGWAP,PPMAX,PPMIN,IPMAX,IPMIN,MORNINGTRADEDVOL,PPTRADEDVOL,IPTRADEDVOL
107845418,GB / Wolv 4th Jan,1m Hcap,04-01-2013 12:00,308730,Beautiful Day,1,9.465853480843236,10.1019838964027616854660071743601306771,11.1278950048089779424753841433470277118,14.5,9,11.5,1.01,4326.1,29479.56,60879.18
107845418,GB / Wolv 4th Jan,1m Hcap,04-01-2013 12:00,2507252,Mcconnell,0,190,97.5965978712891753968882310671976326209,50.9020437043534856288823120231050380171,190,30,800,100,620.6,2809.76,160.16
107845418,GB / Wolv 4th Jan,1m Hcap,04-01-2013 12:00,2945222,Final Drive,0,14.459238303511668,10.5627217923909871967757025103478108128,7.90496878658036490713945239305803609725,16,6.6,690,15,7400.2,37520.16,1621.82

C'è un modo per ovviare al problema??
(Allego il file .csv)
Grazie

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 15:47
Sabato, 05/01/2013
Posta il codice che hai usato per leggere il file.

Se l' hai aperto in modalita testuale, i fine riga non vengono riportati.

PM Quote
Avatar
gvigliani (Normal User)
Pro


Messaggi: 106
Iscritto: 30/12/2006

Segnala al moderatore
Postato alle 18:23
Sabato, 05/01/2013
Testo quotato

Postato originariamente da Poggi Marco:

Posta il codice che hai usato per leggere il file.

Se l' hai aperto in modalita testuale, i fine riga non vengono riportati.



Codice sorgente - presumibilmente Delphi

  1. IFN1 = FreeFile()
  2.  
  3. Open App.Path & "\strsource.txt" For Input As #IFN1
  4. gc = 0
  5.  
  6. While Not EOF(IFN1)
  7.       Line Input #IFN1, Temp
  8.     If Mid$(Temp, 1, 8) <> "EVENT_ID" Then
  9.         gc = gc + 1
  10.         gare_cav(gc) = Temp
  11.         stat_range = Split(Temp, ",")            'per ogni riga (cavallo) la scompongo
  12.        For X = 0 To UBound(stat_range()) - 1
  13.            single_horse(gc, X) = stat_range(X)  ' ogni singola informazione la metto in un array
  14.         Next X
  15.     End If
  16. Wend
  17. Close #IFN1



Il codice apre il file ed incomincia a leggere una riga per volta.  Al termine di ogni lettura suddivide la riga in valori delimitati da una virgola e li inserisce in un array.


Saluti

Gaspare

PM Quote
Avatar
gibra (Normal User)
Pro


Messaggi: 155
Iscritto: 16/04/2009

Segnala al moderatore
Postato alle 22:04
Sabato, 05/01/2013
1° non vedo l'allegato .CSV

2° Perchè usi questo codice?
Codice sorgente - presumibilmente Visual Basic 6

  1. If Mid$(Temp, 1, 8) <> "EVENT_ID" Then



A parte questo, io caricherei tutto il file in una variabile:

Codice sorgente - presumibilmente VB.NET

  1. Dim i As Long
  2. Dim sContents As String
  3. sContents = FileText(tuoFile)
  4.  
  5. ' creo l'array delle righe
  6. Dim sRows() As String
  7. sRows = Split(sContenst, vbCrLf)
  8. Dim sRow() As String
  9.  
  10. '
  11. ' ora puoi elaborre riga per riga con il tuo codice
  12. '
  13.  
  14. Function FileText(ByVal filename As String) As String
  15.     Dim handle As Integer
  16.    
  17.     ' ensure that the file exists
  18.     If Len(Dir$(filename)) = 0 Then
  19.         Err.Raise 53   ' File not found
  20.     End If
  21.    
  22.     ' open in binary mode
  23.     handle = FreeFile
  24.     Open filename$ For Binary As #handle
  25.     ' read the string and close the file
  26.     FileText = Space$(LOF(handle))
  27.     Get #handle, , FileText
  28.     Close #handle
  29. End Function



PM Quote
Avatar
gvigliani (Normal User)
Pro


Messaggi: 106
Iscritto: 30/12/2006

Segnala al moderatore
Postato alle 12:05
Domenica, 06/01/2013
Testo quotato

Postato originariamente da gibra:

1° non vedo l'allegato .CSV

2° Perchè usi questo codice?
Codice sorgente - presumibilmente Visual Basic 6

  1. If Mid$(Temp, 1, 8) <> "EVENT_ID" Then



A parte questo, io caricherei tutto il file in una variabile:

Codice sorgente - presumibilmente VB.NET

  1. Dim i As Long
  2. Dim sContents As String
  3. sContents = FileText(tuoFile)
  4.  
  5. ' creo l'array delle righe
  6. Dim sRows() As String
  7. sRows = Split(sContenst, vbCrLf)
  8. Dim sRow() As String
  9.  
  10. '
  11. ' ora puoi elaborre riga per riga con il tuo codice
  12. '
  13.  
  14. Function FileText(ByVal filename As String) As String
  15.     Dim handle As Integer
  16.    
  17.     ' ensure that the file exists
  18.     If Len(Dir$(filename)) = 0 Then
  19.         Err.Raise 53   ' File not found
  20.     End If
  21.    
  22.     ' open in binary mode
  23.     handle = FreeFile
  24.     Open filename$ For Binary As #handle
  25.     ' read the string and close the file
  26.     FileText = Space$(LOF(handle))
  27.     Get #handle, , FileText
  28.     Close #handle
  29. End Function






2° Perchè usi questo codice?
Codice sorgente - presumibilmente Visual Basic 6

  1. If Mid$(Temp, 1, 8) <> "EVENT_ID" Then



Uso questo codice perchè la prima riga di ogni file è composta da dati che non mi interessano. Quindi filtro e passo oltre.

Non riesco a capire il perchè ma il codice postato non funziona e quando ha finito di leggere il file , la variabile resta vuota.

Saluti

PM Quote
Avatar
gvigliani (Normal User)
Pro


Messaggi: 106
Iscritto: 30/12/2006

Segnala al moderatore
Postato alle 12:23
Domenica, 06/01/2013
Mi correggo!!  Il file viene letto rogolarmente ma quando si lancia lo Split , questo non divide niente vedendo come vbCrLf  soltanto quello di fine file.
In pratica non effettua la divisione delle righe.
In sRows(0) c'è tutto il file completo (Ne riporto solo una parte).

107862534,GB / Winc 5th Jan,2m Hcap Hrd,05-01-2013 15:50,5910006,Toujours Lattaque,0,58.27277979468928,37.7494597921040013576237039582967416312,18.570225502623529010683171293354862904,60,23,1000,50,156.94,7836.68,736.72
107862534,GB / Winc 5th Jan,2m Hcap Hrd,05-01-2013 15:50,5910302,Fitandproperjob,0,15.729733048,11.9331304643025296310557404500722229072,9.75148280443469479898766300685748939001,17,9.4,1000,15,289.48,30917.32,1113.44
107862534,GB / Winc 5th Jan,2m Hcap Hrd,05-01-2013 15:50,5956016,Sutton Storm,0,32.22470477115827,20.5968325073022125025588128439292615507,16.2637898171039705063855913408051864267,36,11.65,1000,25,427.58,11812.86,598.58
107862534,GB / Winc 5th Jan,2m Hcap Hrd,05-01-2013 15:50,5961828,Umoristic,0,11.987385335651362,11.5299846985304562841347083401235883461,19.1170625804136692168218808335490792878,24.19,10.5,570,10,151.1,25145.04,2229.44
107862534,GB / Winc 5th Jan,2m Hcap Hrd,05-01-2013 15:50,5982775,The Young Master,0,41.59539278672308,33.6565420998292673029371000761317415252,25.69323297706745179972622


Saluti
Gaspare

Ultima modifica effettuata da gvigliani il 06/01/2013 alle 12:24
PM Quote
Avatar
gibra (Normal User)
Pro


Messaggi: 155
Iscritto: 16/04/2009

Segnala al moderatore
Postato alle 12:32
Domenica, 06/01/2013
Ti avevo già chiesto l'allegato .CSV... :heehee:

Se avessi il file potrei analizzarlo e dirti qual'è il problema.:D

PM Quote
Avatar
gvigliani (Normal User)
Pro


Messaggi: 106
Iscritto: 30/12/2006

Segnala al moderatore
Postato alle 14:05
Domenica, 06/01/2013
Testo quotato

Postato originariamente da gibra:

Ti avevo già chiesto l'allegato .CSV... :heehee:

Se avessi il file potrei analizzarlo e dirti qual'è il problema.:D




Pensavo di averlo messo come allegato negli altri post.  In questo te l'ho zippato.

Ciao

Gaspare


gvigliani ha allegato un file: dwbfpricesirewin06012013.zip (8149 bytes)
Clicca qui per scaricare il file
PM Quote
Avatar
gibra (Normal User)
Pro


Messaggi: 155
Iscritto: 16/04/2009

Segnala al moderatore
Postato alle 17:25
Domenica, 06/01/2013
Il problema è dato perchè nel tuo file non è stato utilizzato il separatore di righe standard che è la coppia CR+LF, vbCrLf.
In sua vece, è stato usato solo il carattere LF (LineFeed), per cui devi usare come separatore di riga il carattere vbLf, ecco perchè la Line Input non funziona.

Usa il mio codice, ma sostituisci vbCrLf con vbLf.

Per verificare il tutto, dopo aver caricato l'array sRows(), esegui questo codice:

Codice sorgente - presumibilmente Visual Basic 6

  1. For i = 0 To UBound(sRows)
  2.         Debug.Print sRows(i)
  3.     Next i



vedrai che conterrà le righe correttamente.

Ora potrai eseguire la tua elaborazione in base alle tue necessità.


;)

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo