Lettura a intervalli

Buongiorno,
ho un problema relativo alla scrittura di un programma che processa dei risultati sperimentali fornendo un file di output filtrato. Praticamente devo ridurre quasi due milioni di dati di file csv (ogni riga ha orario e misura) a 2000 righe circa. Utilizzo OpenDialog per aprire il file e voglio leggere le prime 900 righe e poi intervalli di un’ora per le righe successive (sono 42 giorni di prova, quindi 900 + 42*24 = 1908 righe). Ho utilizzato questo codice, utilizzando Round e dividendo per 3600, dato che il file csv ha dati quasi per ogni secondo:

f = dlg.ShowModal J=1 If f <> nil then t=TextInputStream.Open(f) While Not t.EOF If Round((J-900)/3600)=(J-900)/3600 or J<=900 then ... J=J+1

Il programma legge le prime 900 righe ma poi si blocca. Dove ho sbagliato o esiste un altro metodo per selezionare le righe da leggere in un file csv?

Grazie

Riporto tutto il codice:

[code] Dim dlg As OpenDialog
Dim f As FolderItem
dlg = New OpenDialog
If Not TargetLinux Then
dlg.InitialDirectory = SpecialFolder.Documents
Else //open Home directory on linux
dlg.InitialDirectory = SpecialFolder.Home
End if

dlg.Title = “Leggi i dati sperimentali”
Dim txtType as New FileType
txtType.Name = “Text File (.csv)"
txtType.MacType = "TEXT (
.csv)”
txtType.Extensions = “csv”
dlg.Filter=txtType

f = dlg.ShowModal

Dim I,J As Integer
Dim Stringa, Pessetto As String
Dim Giorno, Mese,Anno,AnnoStart,Ora,Minuto,Secondo,Misura,Deformazione,Tempo,Tempo0 As Double
Dim t As TextInputStream
Dim Acapo As String 'variabile per la scrittura su file dei risultati
Dim Cifra As Double 'variabile per la scrittura su file dei risultati
Dim Pezzo As String 'variabile per la scrittura su file dei risultati

Label2.Visible=true
Acapo = " "
Call ScriviRTF(Acapo, 0, False, False, 12, 1, “Courier New”, 0)
Stringa = “Tempo trascorso Deformazione”
Call ScriviRTF(Stringa, 0, False, True, 12, 1, “Courier New”, 0)
Stringa = " [ore]"
Call ScriviRTF(Stringa, 0, False, True, 12, 1, “Courier New”, 0)
Call ScriviRTF(Acapo, 0, False, False, 12, 1, “Courier New”, 0)
J=1
If f <> nil then
t=TextInputStream.Open(f)
'Sceglie le righe da processare

'Processa la riga selezionata
While Not t.EOF
  If Round((J-900)/3600)=(J-900)/3600 or J<=900 then
    Stringa=t.readline
    Pessetto=Left(Stringa,2)
    Giorno=CDbl(Pessetto)
    Pessetto=Mid(Stringa,4,2)
    Mese=CDbl(Pessetto)
    Pessetto=Mid(Stringa,7,4)
    Anno=CDbl(Pessetto)
    Pessetto=Mid(Stringa,12,2)
    Ora=CDbl(Pessetto)
    Pessetto=Mid(Stringa,15,2)
    Minuto=CDbl(Pessetto)
    Pessetto=Mid(Stringa,18,2)
    Secondo=CDbl(Pessetto)
    Pessetto=Right(Stringa,10)
    'Trasforma la virgola in punto nella misura dell'allungamento
    For I=1 to 10
      Stringa=Mid(Pessetto,11-I,1)
      if Stringa="," Then 
        Pessetto=Left(Pessetto,10-I)+"."+Right(Pessetto,I-1)
        Exit For
      End if
    Next I
    Misura=CDbl(Pessetto)
    'Registra l'istante di inizio della prova
    If J=1 Then
      Call ElapsedTime(Giorno,Mese,Anno,Ora,Minuto,Secondo,Tempo0)
      AnnoStart=Anno
    Else
      Call ElapsedTime(Giorno,Mese,Anno,Ora,Minuto,Secondo,Tempo)
    End if
    
    If Anno=AnnoStart Then
      Tempo=Tempo0-Tempo
    Else
      Tempo=Tempo0+Tempo
    End if
    'Ora "Tempo"  effettivamente il tempo trascorso in ore
    Deformazione=Misura/200.
    'Scrive i risultati a monitor
    
    If J=1 Then Tempo=0
    If Not t.EOF Then
      Cifra = ((Tempo+ 0.00001) * 10000) / 10000
      Pezzo = "           " + Replace(Format(Cifra, "0.0000"), ",", ".")
      Stringa =Right(Pezzo, 11)
      Cifra = ((Deformazione+ 0.0000001) * 1000000) / 1000000
      Pezzo = "           " + Replace(Format(Cifra, "0.000000"), ",", ".")
      Stringa = Stringa + Right(Pezzo, 11)
      Call ScriviRTF(Stringa, 0, False, False, 12, 1, "Courier New", 0)
      J=J+1
    End if
  Else
    Exit
  End if
  Label2.Text="Righe del file di imput processate="+Str(J-1)
  Label2.Refresh
Wend

End if
PushButton2.Visible=true
PushButton2.Enabled=true
[/code]

f = dlg.ShowModal
  J=1
  If f <> nil then
    t=TextInputStream.Open(f)
    While Not t.EOF
      Stringa=t.readline
      If  j<=900 or ((j-900) mod 3600) = 0 then
...
   J=J+1

ho modificato come mi ha suggerito ma il programma riporta solo le prime 900 righe, il contatore che ho messo come label mi riporta “numero di righe processate: 900” e compare il pulsante per salvare i risultati, segno che ha finito il processo e non va avanti per gli altri J.

Ho eliminato un Else Exit, ora il programma dopo le 900 righe si blocca (senza mostrare il pulsante di salvataggio dei risultati)

Gianmaria,
credo che alcune cose nel programma che presumo tu abbia scritto, siano da rifare senza ripensamenti visto che non capisci il motivo del blocco.

La variabile j soffre di solitudine in testa e in coda al metodo, non ha un nome significativo, non viene gestista secondo l’intento, non si capisce perche’ abbia un valore iniziale pari a 1…

Il loop dovrebbe quindi indicativamente essere:

f = dlg.ShowModal
If f <> nil then
  t=TextInputStream.Open(f)
  dim righeLette As Integer
  While Not t.EOF
    Stringa=t.readline
    righeLette = righeLette + 1
    If righeLette<=900 or ((righeLette-900) mod 3600) = 0 then

    End if
  Wend
end If

In ogni caso se il programma si blocca il debugger ti permette di verificare il funzionamento del programma.

Buon lavoro.

Per prima cosa la ringrazio per il suggerimento.
Avevo posto J=1 per avere il punto di partenza per convertire orari (dd/mm/yyyy hh:mm:ss) in ore. Utilizzo il metodo ElapsedTime:

If Mese = 1 Then Tempo = 31. - Giorno + 334. If Mese = 2 Then Tempo = 28. - Giorno + 306. if Round((Anno/4)*4)=Anno Then Tempo=Tempo+24 End if End If If Mese = 3 Then Tempo = 31. - Giorno + 275. If Mese = 4 Then Tempo = 30. - Giorno + 245. If Mese = 5 Then Tempo = 31. - Giorno + 214. If Mese = 6 Then Tempo = 30. - Giorno + 184. If Mese = 7 Then Tempo = 31. - Giorno + 153. If Mese = 8 Then Tempo = 31. - Giorno + 122. If Mese = 9 Then Tempo = 30. - Giorno + 93. If Mese = 10 Then Tempo = 31. - Giorno + 61. If Mese = 11 Then Tempo = 30. - Giorno + 31. If Mese = 12 Then Tempo = 31. - Giorno Tempo =Tempo*24. 'Ore, minuti e secondi in ore Tempo=Tempo+24-Ora Tempo=Tempo+(60-Minuto)/60 Tempo=Tempo+(60-Secondo)/3600

Con J=1 ho il Tempo0 che la differenza in ora dall’orario di inizio prova alla fine dell’anno. Per le altre J calcolo il Tempo e trovo l’ora come differenza. Con il suo consiglio, ora mi calcola tutti i J ma la conversione in ore non funziona bene: fino a 393,… ore va bene poi non capisco perch ma le ore scendono per poi risalire (il file csv che leggo ha invece orari sempre crescenti).
Ho sbagliato qualcosa nel metodo?

ok ho corretto. La ringrazio ancora per l’aiuto.