Novità

Come addomesticare un file di testo

genios

Advanced Member >PLATINUM<
Se ho un file di testo di numeri composto da 1 colonna e 10 righe (o molte di più ) esempio :


23
1
34
12
25
54
7
9
10
23

è possibile fare la somma dei numeri a righe di 4 scalando poi di 1 riga e sommare le 4 righe successive e cosi via . esempio :

23
1
34
12
somma 60

1
34
12
25
somma 72

e cosi via fino ad arrivare alle ultime 4 righe composte da

7
9
10
23

somma 49

ciao eugenio
 

Mike58

Advanced Member >PLATINUM PLUS<
Ciao,Eugenio,ingegnandosi tutto è possibile.
Ho fatto la modifica ad uno script esistente ( che legge il file colonnare di testo) e ti riporta le prime somme, devi poi se lo ritieni, fare tutte le somme che vuoi scrivere per i tuoi scopi.

provaci.

Codice:
Class clsCombinazione
 Private aNumeri
 Function SetNumeriFromRiga(sRiga,sChrSep)
  Dim k,nUpper
  ReDim aV(0)
  Call SplitByChar(sRiga,".",aV)
  nUpper = 0
  ReDim aNumeri(nUpper)
  For k = 0 To UBound(aV)
   If IsNumeric(aV(k)) Then
    If isNumeroValidoLotto(CInt(aV(k))) Then
     nUpper = nUpper + 1
     ReDim Preserve aNumeri(nUpper)
     aNumeri(nUpper) = CInt(aV(k))
    End If
   End If
  Next
  If nUpper > 0 Then
   SetNumeriFromRiga = True
  Else
   SetNumeriFromRiga = False
  End If
 End Function
 Sub GetArrayNumeri(aNum)
  aNum = aNumeri
 End Sub
End Class
Sub AlimentaCollComb(sFile,Coll,sChrSep)
 Dim k
 Dim clsComb
 Set Coll = GetNewCollection
 ReDim aRighe(0)
 Call LeggiRigheFileDiTesto  (sFile,aRighe)
 For k = 0 To UBound(aRighe)
  Set clsComb = New clsCombinazione
  If clsComb.SetNumeriFromRiga(aRighe(k),sChrSep) Then
   Coll.Add clsComb
  End If
 Next
End Sub
Sub Main
 Dim sFileCombinazioni
 Dim sDirDef
 Dim CollCombinazioni
 Dim clsComb
 Dim aNumeri
 Dim Ru(1)
 sDirDef = GetDirectoryAppData
 sFileCombinazioni = ScegliFile(sDirDef,".txt")
 Call AlimentaCollComb(sFileCombinazioni,CollCombinazioni,".")
 ' ciclo su tutte le combinazioni da analizzare
 For Each clsComb In CollCombinazioni
  kn = kn + 1
  Call clsComb.GetArrayNumeri(aNumeri)
  ' ora abbiamo i numeri della combinazione corrente
  ' semplicemente per esempio scrivo la stringa numeri ma in un caso reale
  ' qui mettero il codice che lavora con la combinazione corrente
  'ImpostaArchivio10ELotto(1)
  fin = EstrazioniArchivio
  Ru(1) = 11
  Call VerificaEsito(aNumeri,Ru,fin - 100,2,100,,esito,,estratti,id)
  Call Scrivi(FormatSpace(kn,2) & vbTab & StringaNumeri(aNumeri,,True),0,0)
  Scrivi vbTab & estratti  & vbTab,0,0
  '......... faccio le somme che voglio ...........................................................
  Scrivi "   Somma (1,2,3) " & Fuori90(aNumeri(1) + aNumeri(2) + aNumeri(3)) & vbTab,0,0
  Scrivi "   Somma (2,3,4) " & Fuori90(aNumeri(2) + aNumeri(3) + aNumeri(4)) & vbTab,0,0
  Scrivi "   Somma (3,4,5) " & Fuori90(aNumeri(3) + aNumeri(4) + aNumeri(5))
  '................................................................................................
 Next
End Sub
 

genios

Advanced Member >PLATINUM<
Grazie Mike58 ma il file testo da leggere e questo allegato .
La tua soluzione presuppone un altro file .

Ciao Eugenio
 

Allegati

  • dieci numeri.txt
    35 bytes · Visite: 3

Mike58

Advanced Member >PLATINUM PLUS<
Ciao Eugenio, il mio file è un file stringa dei numeri su una sola riga e per + righe ( nel caso ad esempio è + righe)
Lo script legge le righe di + elementi e nel tuo caso hai 10 righe di 1 elemento, il chè non va bene.

Penso che non ti sia difficile mettere i numeri in una sola riga(divisi dal ".") in modo poi da poterli richiamare con lo script.



P.s. l'importante che le righe abbiano la stessa lunghezza.

Ciao fammi sapere
 
Ultima modifica:

genios

Advanced Member >PLATINUM<
Dopo qualche tentativo sono riuscito a far questo :

Codice:
Option Explicit
Sub Main
    Dim sfile,y
    ReDim aRighe(0)
    sfile = ScegliFile("c:\dieci numeri",".txt","dieci numeri.txt")
    Call LeggiRigheFileDiTesto(sfile,aRighe)
    For y = 0 To UBound(aRighe)
        If aRighe(y) <> " " Then
            ReDim aNum(0)
        End If
        Call SplitByChar(" " & aRighe(y)," ",aNum)
        Scrivi StringaNumeri(aNum,"")
    Next
End Sub

In out ho
45
54
65
5
7
67
87
78
9
10

con questo script apro il file dieci numeri , lo leggo , lo stampo.
ora occorre fare la somma del valore delle righe da 1 a 4 .
 

genios

Advanced Member >PLATINUM<
Occorre ora per fare la somma convertire i caratteri stringa di ogni riga in caratteri numerici con la funzione CInt mi da errore dove sbaglio ?

Ciao Eugenio
 

Mike58

Advanced Member >PLATINUM PLUS<
Eugenio non lo so neanche io e come dici ma per ora neanche io riesco a metterli in NumeriVettori.
Ci riprovo anch'io ma per ora niente.

Ciao
 

i legend

Premium Member
Ciao a Tutti
Mike ti allego un pezzettino di codice vedi se può fare al caso tuo
purtroppo in questo periodo sono impegnatissimo e non ho molto tempo da dedicare alle cose divertenti
Codice:
Option Explicit
'script da Verificare
'Per Eugenio forum LottoCed
'Esempio cosi com è
'Salvo errori ed omissis
Sub Main
    Dim i,j,Som
    Dim Passo:Passo = 3
    ReDim aRit(0)
    Call ScegliNumeri(aRit)
    Scrivi StringaNumeri(aRit)
    If UBound(aRit) > Passo Then
        For i = 1 To UBound(aRit) - Passo
            Som = 0
            For j = 0 To Passo
                Scrivi aRit(i + j) & "+"
                Som = Som + aRit(i + j)
            Next
            Scrivi"____"
            Scrivi Som
            Scrivi
        Next
    End If
End Sub
Ciao se non è corretto per favore dimmelo che cancello
ciao a tutti :)
 

Mike58

Advanced Member >PLATINUM PLUS<
Ciao I Legend, chiaro che così raggiunge lo scopo, dovresti però allacciare il file di testo di genios e fare i calcoli sulle righe lette.
Pur leggendole e scrivendole in output, almeno sino ad ora non si riesce a fare le somme per righe.

Sicuramente è una banalità,ma a volte qualcosa sfugge.

P.s. perché cancellare il tuo aiuto è carino e di aiuto per scopi vari.

Mike
 

joe

Advanced Member >PLATINUM PLUS<
Buon giorno a tuute/i.

Esatto: Ha ragione Mike.

Al di sopra del funzionare lo script deve

assolvere all'uso per cui è concepito.

Vero anche quanto scrive Ilegend.

quando accenna implicitamente al fatto che i dati

da elaborare, forse, sono mal organizzati.

Ma è altrettanto vero che, è sbagliato complicare la situazione (splittandoli ecc.).

Vi potrei dunque proporre "la soluzione"

ma questo non vi aiuta nel comprendere.

Quindi mi limito ad un suggerimento, sulla "lettura" dello script.

LeggiRigheFileDiTesto si comporta come la macchinetta di una chiusura a lampo.

Di una zip.

Cioè abbina i dentini della colonna che avete immaginato essere verticale, Cioè, "I DATI",

a quelli dell "arrayRighe" che avete ipotizzato essere un contenitore ORIZZONTALE (poi da splittare).

Dopo questo "indizio" e cioè, dicendo che ha ragione ILEGEND

ove afferma che non è da splittare ... (Aggiungo) perchè è già un array ...

Vi dovrebbe essere semplice individuare la soluzione.

[IMG2=JSON]{"data-align":"none","data-size":"full","src":"http:\/\/i64.tinypic.com\/hwz42a.jpg"}[/IMG2]

:)
 
Ultima modifica:

i legend

Premium Member
Ciao Joe è la soluzione verso la quale mi stavo orientando. Appena ho la possibilità butto giù qualche riga .ma francamente del quesito il mio interesse ricadeva nella flessibilità ottenibile con i due cicli for senza fare il +1 si tre elementi.
per scrivere un bel codice ( anche per chi prende spunto e impara) è bene partire da un idea chiara e ottimizzare il percorso da seguire.
purtroppo questo non sempre è pertanto a volte si vedono script complessi e lenti .
ma è solo una mia opinione.
Ciao Joe :)
 
L

LuigiB

Guest
ciao Legend , io voglio dirti bravo sia per quanto hai espresso riguardo la faccenda delle idee chiare sia per lo script postato perche da come l'ho capita io è perfettamente adattabile con pochissimo sforzo alla somma dei numeri letti dalle righe di un file di testo , è chiaro che il file di testo deve avere un solo numero per riga altrimenti vanno fatte modifiche.
Posso fare solo l'osservazione che non c'è niente di male a fare un solo ciclo for e un contatore interno anche perche come puoi notare genios ha paralto di passo 4 ru con il ciclo for invece hai dovuto impostarei l valore del passo a 3 pur leggendo 4 righe ,, con un contatore non sarebbe successo ... rimane comunque il fatto che il tuo è un buon codice.. ciao !
 

Mike58

Advanced Member >PLATINUM PLUS<
Ciao a tutti, lo script di legend funziona benissimo, anche allacciando il file di testo dei numeri in esame.

Codice:
Option Explicit
'script da Verificare
'Per Eugenio forum LottoCed
'Esempio cosi com è
'Salvo errori ed omissis
Sub Main
    Dim i,j,Som,sFile
    Dim Passo:Passo = 3
    ReDim aRighe(0)
sFile = ScegliFile("c:\dieci numeri",".txt","diecinumeri.txt")

Call LeggiRigheFileDiTesto(sFile,aRighe)
    'Call ScegliNumeri(aRit)
    Scrivi StringaNumeri(aRighe,,1),1
Scrivi
    If UBound(aRighe) > Passo Then
        For i = 0 To UBound(aRighe) - Passo
            Som = 0
            For j = 0 To Passo
                Scrivi Format2 (aRighe(i + j)) & "+"
                Som = Som + aRighe(i + j)
            Next
            Scrivi"____"
            Scrivi Som,1,,,1
            Scrivi
        Next
    End If
End Sub
 

i legend

Premium Member
Ciao a Tutti :)
Innanzi tutto
GRAZIEEEEEEEEEE PROF :)
bravissimo mike
ieri quando l avevo postato non avevo guardato il funzionamento con il file di testo
allego una seconda soluzione controllare se va bene
la routine funziona solo su colonna unica perchè cosi è stato richiesto
il percorso e il file va scelto
eugenio per favore verifica se va bene
Mike potresti controllare anche questo per favore
Codice:
Option Explicit
' script per Eugenio
' lo script legge un file di testo a colonna unica come da richiesta ed esegue le somme a passi richiesti
'Salvo errori ed omissis
Sub Main
    Dim i, j,som
    Dim iPass:iPass = 3

    Dim sFile:sFile =" "  ' qui scrivere il percorso del file da analizzare

    ReDim aNum(0)
    Call LeggiRigheFileDiTesto(sFile,aNum)
    If UBound(aNum)>iPass Then
    For i = LBound(aNum) To UBound(aNum) - iPass
        som = 0
        For j = 0 To iPass
            Scrivi aNum(i + j) & "+"
            If IsNumeric(aNum(i + j)) Then
                som = som + aNum(i + j)
            End If
        Next
        Scrivi"____"
        Scrivi som,1,,,1
        Scrivi
    Next
    End If
End Sub
ciao a tutti ;)
 

i legend

Premium Member
Ciao Luigi ma con solo un ciclo ed un contatore interno rimane ugualmente flessibile ? se si sicuramente è piu veloce
appena ho un po di tempo mi ci dedico , grazie per i suggerimenti;)
ciao Prof ;)
 
L

LuigiB

Guest
certo perche no ? tutto parametrizzato basta cambiare il passo all'inizio e funziona perfettamente , la cosa si puo realizzare con un banale if , una variabile contatore si incrementa dopo aver letto la stringa , si somma il numero letto addizionandolo in una variabile di appoggio , se il contatore è uguale a passo si scrive in output il valore della variabile di appoggio e dopo si azzera sia variabile di appoggio che contatore
fuori dal ciclo si scrive il valore corrente della variabile di appoggio dato che se il numero delle righe non è divisibile per il passo avremo un resto ..
ciao
 

joe

Advanced Member >PLATINUM PLUS<
Un saluto a Mike a Luigi e tutte/i Voi.

Quanto avevo realizzato è praticamente identico a quanto avete già postato.

Lo aggiungo egualmente, per dovere di completezza ed eventuali confronti:

Codice:
Option Explicit
Sub Main
	Dim sfile,y,x,z,t
	ReDim aRighe (0)
	sfile = ScegliFile("K:DieciNnumeri",".txt","DieciNumeri.txt")
	Call LeggiRigheFileDiTesto(sfile,aRighe)
	For x = 0 To UBound(aRighe) - 4
		t = 0
		For y = 0 To 3
			z = Eval(aRighe(x + y))
			Scrivi FormatSpace(Format2(z),3,True) & " +"
			t = t + z
		Next
		Scrivi String (5,"-")
		Scrivi FormatSpace(t,3,True) & " =" 
		Scrivi
	Next
End Sub

:)
 

Ultima estrazione Lotto

  • Estrazione del lotto
    giovedì 18 aprile 2024
    Bari
    13
    39
    14
    70
    78
    Cagliari
    67
    65
    03
    87
    63
    Firenze
    85
    90
    19
    67
    78
    Genova
    60
    81
    39
    33
    13
    Milano
    90
    01
    83
    11
    88
    Napoli
    18
    12
    80
    29
    19
    Palermo
    50
    83
    40
    24
    12
    Roma
    74
    48
    75
    65
    37
    Torino
    80
    46
    44
    27
    30
    Venezia
    70
    16
    72
    03
    89
    Nazionale
    89
    22
    06
    87
    13
    Estrazione Simbolotto
    Genova
    28
    21
    43
    25
    17

Ultimi Messaggi

Alto