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
 
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
 
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:
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 [TABLE="border: 1, cellpadding: 1, width: 500"]
[TR]
[TD]45[/TD]
[/TR]
[TR]
[TD]54[/TD]
[/TR]
[TR]
[TD]65[/TD]
[/TR]
[TR]
[TD]5[/TD]
[/TR]
[TR]
[TD]7[/TD]
[/TR]
[TR]
[TD]67[/TD]
[/TR]
[TR]
[TD]87[/TD]
[/TR]
[TR]
[TD]78[/TD]
[/TR]
[TR]
[TD]9[/TD]
[/TR]
[TR]
[TD]10[/TD]
[/TR]
[/TABLE]

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 .
 
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
 
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
 
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 :)
 
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
 
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:
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 :)
 
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 !
 
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
 
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 ;)
 
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 ;)
 
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
 
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
    sabato 18 gennaio 2025
    Bari
    24
    76
    02
    72
    12
    Cagliari
    21
    08
    77
    04
    17
    Firenze
    74
    84
    07
    12
    72
    Genova
    13
    07
    33
    47
    18
    Milano
    01
    34
    09
    55
    48
    Napoli
    46
    23
    25
    03
    06
    Palermo
    44
    07
    01
    46
    84
    Roma
    88
    78
    64
    74
    04
    Torino
    07
    87
    67
    38
    53
    Venezia
    31
    25
    04
    18
    02
    Nazionale
    49
    82
    59
    65
    67
    Estrazione Simbolotto
    Bari
    03
    13
    31
    23
    35

Ultimi Messaggi

Indietro
Alto