Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

scrivere text file da 2d array

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

scrivere text file da 2d array

Postdi miko » 12/09/21 16:32

Buon pomeriggio e buona domenica,
ho una matrice popolata direttamente dal foglio con il codice
Array1= range("H" & riga_iniziale & ":N" & riga_finale)
scorrendo la matrice quando trovo una riga di interesse popolo
una matrice temporanea Array2;
quando il ciclo è terminato trasferisco la matrice Array2
direttamente su un foglio ed infine dal foglio scrivo il text file.
è possibile superare qualche passaggio e scrivere direttamente
dalla matrice Arra1, quando si trova la riga di interesse, il text, oppure,
forse è più veloce, popolare la matrice temporanea Array2 e da questa,
magari in una sola volta, scrivere il text file?
ciao, grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 492
Iscritto il: 29/12/09 10:44

Sponsor
 

Re: scrivere text file da 2d array

Postdi Anthony47 » 13/09/21 12:50

Si fa presto a dire "scrivere il file", ma in che formato?

Ad esempio, se Array2 contiene un tot di righe * un tot di colonne allora il seguente codice scrive nel file "C:\PROVA\TextTable.txt" quel contenuto in formato "csv":
Codice: Seleziona tutto
Dim myFree
'
myFile = "C:\PROVA\TextTable.txt"           '<<< Percorso e nome file
'
myFree = FreeFile
Open myFile For Output As #myFree
  For i = 1 To UBound(Array2)
    For j = 1 To UBound(Array2, 2)
        myr = myr & ";" & Array2(i, j)
    Next j
    Print #myFree, Mid(myr, 2)
Next i
Close #myFree


Vedi se ti puo' tornare utile, altrimenti spiega meglio

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17865
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: scrivere text file da 2d array

Postdi miko » 14/09/21 08:42

Buongiorno,
mi ha sorpreso leggere
Si fa presto a dire "scrivere il file", ma in che formato?
Ad esempio, se Array2 contiene un tot di righe * un tot di colonne allora il seguente codice scrive nel file "C:\PROVA\TextTable.txt" quel contenuto in formato "csv":

per me, fino ad ora, un file di testo con estensione .txt era un file di testo ma che poi
il suo contenuto fosse di altro formato non mi era noto.
... ed allora come faccio a sapere che tipo di formato è il suo contenuto?
quello che vorrei ottenere è quanto segue:
le celle da esaminare sono in formato numero e contengono numeri,
questi numeri vengono inseriti nell'Array1 con il codice :
Array1= range("H" & riga_iniziale & ":V" & riga_finale)
trasferisco nell'Array2 le righe interessanti di Array1
inserisco le righe di Array2 in un file di testo con estensione .txt contenente numeri.
vorrei evitare inutili azioni e dall'Array1, quando si trova la riga di interesse,
inserirla direttamente nel text file con le caratteristiche descritte.
la particolarità del text file è che i numeri con 1 cifra devono trovarsi sulla destra
rispetto ai numeri con 2 cifre, in una stessa colonna del text file
esempio:
riga1: _1 15 78 99 .... _4 25 _8 (l'underscore è inserito solo per spostare i numeri sulla destra, ma non riguarda la situazione)
riga2: 16 32 _9 85 .... 97 _6 94
è come se i numeri con 1 cifra diventassero 01, 07, 09, con lo zero davanti anche se non è presente.
inoltre tra 2 numeri su una stessa riga c'è solo 1 spazio.
ho provato manualmente a costruire un facsimile di riga del txt concatenando
i valori delle celle in una stringa ed inserendo 1 spazio davanti ai numeri con 1 cifra
MyString = spazio & 1 & 15 & .... & spazio & 4 & 25 & spazio & 8
(è come se in una unica cella ci fossero più numeri)
e poi ad inserirlo in un text file vuoto.
il risultato funziona ma il procedimento è stato creato manualmente e non sò
come iterarlo per tutte le righe di Array1 o Array2,
e non posso sapere a priori in quale delle 15 colonne si trova il numero con 1 cifra.
ciao, grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 492
Iscritto il: 29/12/09 10:44

Re: scrivere text file da 2d array

Postdi Anthony47 » 14/09/21 10:55

In linea di massima, se hai un processo automatizzato e funzionante allora secondo me sei a posto così: perche' "funzionante=ben fatto"

Comunque, leggendo il tuo messaggio, dopo aver cercato di incrociare la tua terminologia con la mia (non senza qualche sostanziale dubbio) ti faccio due esempi.

1-Inserire il contenuto di tutto Array2 in un file txt, formattando ogni numero con 2 cifre e separando con lo spazio due numeri adiacenti. Array2 deve gia' contenere i dati da scrivere nel file.
Codice: Seleziona tutto
Dim myFree, I As Long, J As Long
'
myFile = "C:\PROVA\TextTable.txt"           '<<< Percorso e nome file
'
myFree = FreeFile
Open myFile For Output As #myFree
  For I = 1 To UBound(Array2)
    myr = ""
    For J = 1 To UBound(Array2, 2)
        myr = myr & " " & Format(Array2(I, J), "00")
    Next J
    Print #myFree, Mid(myr, 2)
Next I
Close #myFree


Risultato (array di 2 righe e 5 colonne):
Codice: Seleziona tutto
11 133 33 04 55
05 13 07 11 12



2-Accodare una specifica riga di Array1 a un file esistente.
In entrata al codice la variabile "aInd" deve contenere il numero della riga di Array1 da accodare al file txt.
Codice: Seleziona tutto
Dim myFree, aInd As Long, J As Long
'
myFile = "C:\PROVA\TextTable.txt"           '<<< Percorso e nome file
'
'a) Apertura file
myFree = FreeFile
Open myFile For Append As #myFree
'
'b) Scrittura di un record
    myr = ""
    For J = 1 To UBound(Array1, 2)
        myr = myr & " " & Format(Array1(aInd, J), "00")
    Next J
    Print #myFree, Mid(myr, 2)
'
'c) Chiusura del file
Close #myFree


Risultato (ultima riga accodata al file precedente):
Codice: Seleziona tutto
11 133 33 04 55
05 13 07 11 12
01 12 03 13 04

Tieni presente pero' che questo metodo rischia di essere oneroso come velocita' di esecuzione perche' a ogni riga da aggiungere si apre il file, si scrive, si chiude.
Se le righe da aggiungere sono tantissime potresti accorgertene; in questo caso sarebbe opportuno portare la "fase a) Apertura file" in testa alla tua macro e la "fase c) Chiusura del file" in coda, in modo che queste operazioni vengano eseguite una sola volta.

Se nessuno dei due esempi si adatta allora forse fai prima a condividere un file txt contenente il risultato cercato e una immagine che visualizza come erano quei dati sul foglio excel.

Per le istruzioni su come allegare un file:
viewtopic.php?f=26&t=103893&p=605487#p605487

Per le istruzioni su come allegare una immagine:
viewtopic.php?f=26&t=103893&p=605488#p605488

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17865
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: scrivere text file da 2d array

Postdi miko » 14/09/21 13:00

salve,
credo che nonostante le perplessità che ho creato penso tu abbia risolto il problema,
vedendo il risultato che hai mostrato, anche se non ho testato i codici.
in termini di velocità il secondo metodo, rispettando il suggerimento che hai evidenziato:
...portare la "fase a) Apertura file" in testa alla tua macro...

mi pare più veloce, si evita la presenza di Array2.
forse sbaglio?
ciao, grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 492
Iscritto il: 29/12/09 10:44

Re: scrivere text file da 2d array

Postdi Anthony47 » 14/09/21 14:57

Col file txt aperto a inizio e chiuso a fine macro il rischio che vedo e' la probabile corruzione del file txt in caso che la Macro si interrompa in modo incontrollato. Personalmente preferirei una soluzione che scrive tutto insieme, quindi transitando da Array2; tra l'altro le copie tra array sono velocissime, quindi non penalizzano i tempi di esecuzione.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17865
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: scrivere text file da 2d array

Postdi miko » 14/09/21 16:20

ciao,
grazie per la sollecitudine ed il tuo impegno
il problema che hai evidenziato circa l'interruzione incontrollata, al quale non ci sarei mai arrivato,
favorisce il primo metodo, ma conservo, sperando di ricordare, anche la seconda soluzione
se non altro per imparare soluzioni diverse.
tuttavia ho un problema che riguarda entrambe le soluzioni
ho testato la soluzione 2
la linea incriminata è

Codice: Seleziona tutto
 myr = myr & " " & Format(Array1(aInd, J), "00")

presente in ambedue i metodi
se il numero con 1 cifra si trova nella prima colonna-prima posizione
il risultato errato è
" 07 16 17 50 99"
mentre deve essere
"07 16 17 50 99"
davanti al primo numero si ha 1 spazio, mentre per gli altri numeri successivi tutto funziona
ho provato a modificare la linea di codice ma inutilmente
allego un text file con poche righe e colonne e l'immagine di excel.
ricordo che le celle sono in formato numero predefinito da excel e non ho fatto altre modifiche alle celle
prima che tu rispondessi mi stavo studiando le funzioni join e application.index con gli array
anche se hai le tue "ricette", ma al solo scopo di imparare, possono essere utili in questo caso ?
fino ad ora non sono riuscito a modificare per il risultato finale con gli esempi trovati
ciao, ed ancora grazie

txt:http://www.filedropper.com/risultatotxt

immagine di excel

Immagine

immagine della formattazione celle

Immagine

p.s. come si fa ad inserire una immagine che rimanga stabilmente nel topic?
in http://www.postimage.org ci sono molti link
molto spesso rivedendo vecchi messaggi non compare l'immagine e si perde
il riferimento visivo molto utile per comprendere.
windows 10 - office 2013
miko
Utente Senior
 
Post: 492
Iscritto il: 29/12/09 10:44

Re: scrivere text file da 2d array

Postdi Anthony47 » 14/09/21 17:20

Non ho idea sul perche' venga aggiunto sistematicamente uno spazio in piu' nel caso che il valore sia a 1 solo digit; a me il risultato e' corretto; ad esempio:
Codice: Seleziona tutto
04 15 02 33 06
11 133 33 04 55
05 13 07 11 12
01 12 03 13 04
13 22 33 44 55

Prova ad aggiungere questa riga di debug in questa posizione:
Codice: Seleziona tutto
    Next J
    Debug.Print I, J, ">" & myr & "<"         '<<< AGGIUNGI PER PROVA
    Print #myFree, Mid(myr, 2)
Next I

Poi prova a creare un txt.
Apri il txt e incolla il testo che ci trovi nel tuo prox messaggio.
Poi vai sul vba e apri la "Finestra Immediata" (contr-g dovrebbe farlo automaticamente; oppure Menu /Visualizza /Finestra Immediata)
Copia quello che ci trovi scritto e incolla pure nel prossimo messaggio; qualcosa tipo
Codice: Seleziona tutto
 1             6            > 04 15 02 33 06<
 2             6            > 11 133 33 04 55<
 3             6            > 05 13 07 11 12<
 4             6            > 01 12 03 13 04<
 5             6            > 13 22 33 44 55<


Infine, con gli stessi dati sul foglio di lavoro, modifica l'istruzione Format(Array2(I, J), "00") facendola diventare Format(Array2(I, J), "000")
Crea il file txt; aprilo, copia il suo contenuto e incolla anche questo nel tuo prox messaggio

Descrivi ovviamente anche le difformita' che noti

Le immagini rimangono in linea fintanto che il gestore le tiene in linea, purtroppo ogni tanto qualcuno si rende conto che immagazzinare "per sempre" file piccoli o grossi alla lunga diventa ingestibile. Detto per inciso, anche i file che io rendo scaricabili tramite Dropbox saranno visibili fintanto che io li tengo nel mio "dropbox"; insomma la soluzione non e' facile e non puo' essere "per sempre"

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17865
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: scrivere text file da 2d array

Postdi miko » 17/09/21 09:13

Buongiorno,
devo correggermi e confermare allo stesso tempo il problema (fittizio) che sollevavo nel mio precedente intervento.
durante il breve test che eseguivo, mi soffermavo col puntatore sulla variabile
myr = myr & " " & Format(Array1(aInd, J), "00")
ad inizio linea, e leggevo il suo contenuto attraverso il toltip che veniva mostrato;
in effetti confermo la presenza dello spazio davanti al primo numero, ma guarda caso il primo numero era con 1 cifra
per test ho inserito un numero con 2 cifre ed anche in questo caso vi è lo spazio ad inizio stringa.
consideravo questo 1 errore e non proseguivo con il resto del codice.
trascuravo, mea culpa, la successiva linea

Print #myFree, Mid(myr, 2)

dove il Mid "trasforma" la stringa iniziale e fornisce quella definitiva senza lo spazio iniziale.

in conclusione, le macro sono perfettamente funzionanti e forniscono il risultato esatto per le quali sono state realizzate

chiedo 2 cose
1- tanto per curiosità, come si modifica la linea di codice se invece dello zero iniziale davanti al numero con 1 cifra si
aggiunge lo spazio?
io ho provato senza riuscirci.

2- volevo inserire una condizione: se Array2 è vuoto è inutile creare-scrivere il text file, in questo caso si salta
in un altro punto del codice oppure si esce dalla procedura.
ho fatto la prova con function.count(Array2) = 0 e function.countA(Array2) = 0, ma con entrambe, variando il contenuto
dell'array, ottengo dei risultati differenti.
ed allora ho pensato che l'array contiene stringhe ed è sufficiente verificare il contenuto del primo item
e quindi scrivere:
if Array2(1,1) = 0 oppure Array2(1,1) = "" oppure Array2(1,1) = " " oppure Array2(1,1) = EMPTY then ....
cosa ne pensi?
ciao grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 492
Iscritto il: 29/12/09 10:44

Re: scrivere text file da 2d array

Postdi Anthony47 » 17/09/21 15:13

Beh, mi aspetterei che l'utente si impegni un po' di piu' a controllare quello che gli viene offerto e non si soffermi sul primo colpo d'occhio :evil: :evil:

Se vuoi usare lo spazio invece che lo 0 iniziale allora devi modificare il ciclo For J / Next J:
Codice: Seleziona tutto
    For J = 1 To UBound(Array2, 2)
        If Len(Array2(I, J)) = 1 Then
            myr = myr & "  " & Array2(I, J)
        Else
            myr = myr & " " & Array2(I, J)
        End If
    Next J


Quanto a testare se Array2 e' vuoto, dipende anche da come e' stata dichiarato l'array; comunque il mio suggerimento e' di usare TextJoin:
Codice: Seleziona tutto
If Len(Application.WorksheetFunction.TextJoin("", True, Array2)) < 2 Then
    'che fare se l'array non ha contenuti?
    '?
    '
End If

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17865
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: scrivere text file da 2d array

Postdi miko » 17/09/21 16:03

ciao,
hai ragione ad essere adirato, mi sono soffermato sulle singole linee e non sul risultato finale
dipende dal voler comprendere nei dettagli ciascuna riga di codice.
chiedo venia.
riguardo a:
... testare se Array2 e' vuoto, dipende anche da come e' stata dichiarato l'array...

ad inizio macro, tra le varie dim ho scritto: DIM Array2()
successivamente: ReDim Array2(1 To N, 1 To 1)
con N = 500 , numero generico, perchè non sò di quante righe sarà costituito
Array2 ed ho inserito un numero grande.
inserisco tutti i valori utili in Array2 ed infine creo il text file con la tua macro del metodo 1
tramite una call.
da quello che conosco se dimensiono Array2 come stringa, avrà base zero,
e questo mi confonde, durante il popolamento, con gli indici.
saluti, grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 492
Iscritto il: 29/12/09 10:44

Re: scrivere text file da 2d array

Postdi Anthony47 » 17/09/21 16:39

L'equivoco sulla base ce l'hai quando dichiari ad esempio come myArray(10) perche' in questo caso normalmente la base e' 0 (a meno che non usi la dichiarazione in cima al modulo "Option Base =1"); questo indipendentemente dal tipo. Ma se dichiari myArray(1 to 10) non hai dubbi: LBound=1, UBound=10, totale 10 elementi.
Una variabile tipo String non sara' mai Empty (quindi non puoi usare If IsEmpty(myArray(1)) Then); il tipo Variant all'inizio e' invece Empty.
L'uso di TextJoin e' anche per non dipendere dalla dichiarazione

Se non sai quante righe ti saranno richieste potresti anche partire con Redim myArray(1 to 1) e poi man mano che scrivi in array farai Redim Preserve myArray, 1 to UBound(myArray)+1)

Ma non c'e' nulla di giusto o di sbagliato: ogni comando fa la sua cosa, qualcuno porta alla soluzione in 1 millisecondo, qualcun'altro ti fara' aspettare 2 millisecondi

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17865
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: scrivere text file da 2d array

Postdi miko » 17/09/21 20:39

ciao,
mi hai ricordato alcune cose e spiegato-chiarito altre.
provo a costruire un ciclo teorico corretto interpretando le tue
indicazioni, senza Option Base =1

'dichiarazione delle variabili
dim j as long, etc
Redim Array2(1 to 1)
'
'
'scrivo in Array2
for j = 1 to n
Array2(j) = ....
Redim Preserve Array2( 1 to (UBound(Array2) + 1))
next j
'
'
'qui ho un dubbio
'il numero di item di Array2 è item = UBound(Array2) - 1 e non UBound(Array2)
'
'scriviamo il text file
If Len(Application.WorksheetFunction.TextJoin("", True, Array2)) < 2 Then
'che fare se l'array non ha contenuti?
NON CREARE IL TEXT FILE, EXIT SUB
ELSE
'che fare se l'array ha contenuti?
CALL METODO 1_ANTHONY (SCRIVI IL TEXT FILE)
End If
'
'
end sub

buonasera, grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 492
Iscritto il: 29/12/09 10:44

Re: scrivere text file da 2d array

Postdi Anthony47 » 17/09/21 23:46

Operando come suggerito, e come hai fatto, alla fine Array2 ha (come hai intuito) l'ultima posizione vuota.
Questo ovviamente ti consente di rivedere il ragionamento su come determinare se Array2 e' vuoto; infatti potresti usare
Codice: Seleziona tutto
If UBound(Array2)=1 Then
    Exit Sub                'Array vuoto
End If

(invece dell'uso di TextJoin)

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17865
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: scrivere text file da 2d array

Postdi miko » 18/09/21 05:50

Buongiorno,
quello che mi meraviglia nella mia ricostruzione è che nella dichiarazione delle variabili
non dichiaro il tipo di Array2 e non scrivo Dim Array2 ma subito Redim Array2(1 to 1)
inoltre come avrai notato avendo inserito la call che richiama la scrittura del text file
la matrice Array2 deve essere pubblica, perciò in cima alla macro ho quindi inserito Public Array2.
infine capisco il concetto dell'ultima condizione If UBound(Array2) = 1 Then
ma se Array2 contiene 1 solo elemento NON VUOTO avrò
LBound(Array2) = UBound(Array2) = 1
ma questo non significa che quell'unico item Array2(1) è VUOTO, almeno credo
oppure mi sfugge qualcosa.
buona giornata grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 492
Iscritto il: 29/12/09 10:44

Re: scrivere text file da 2d array

Postdi Anthony47 » 18/09/21 09:59

Non c'e' l'obbligo di dichiarare una variabile, ma dichiararla e' buona pratica; solo nella dichiarazione puoi anche imporre un "tipo di dati" che facilita l'allocazione della memoria per la variabile. Ma nel tuo caso, Array2 la dichiari: come variabile Public di tipo Variant (il tipo di default), e Variant puo' contenere anche un array
Attenzione: se la dichiari Public la variabile mantiene il suo contenuto tra una esecuzione e un'altra; ma Redim la azzera, salvo che non sia un Redim Preserve.

ma se Array2 contiene 1 solo elemento NON VUOTO avrò
LBound(Array2) = UBound(Array2) = 1
No, UBound(Array2) sara' 2 perche' nel ciclo era incluso Redim:
Codice: Seleziona tutto
for j = 1 to n
    Array2(j) = ...                                      'Compila l'elemento attuale
    Redim Preserve Array2( 1 to (UBound(Array2) + 1))    'Aggiunge un elemento
next j

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17865
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "scrivere text file da 2d array":


Chi c’è in linea

Visitano il forum: Nessuno e 46 ospiti