Italian Riordinare un file

AlpVir

Well-Known Member
Licensed User
Longtime User
Faccio seguito ad un mio post ( https://www.b4x.com/android/forum/threads/disordine-in-un-file-ini.68463/#post-434534 ) in cui chiedevo come riordinare un file di testo (un file INI).
Non se ne era venuto a capo e, considerando che la cosa non era importante avevo lasciato perdere.
Adesso il file INI è assai più consistente e desidereri veramente poterlo riordinare, ma non ci riesco.
Sembrerebbe assai facile ma ....
Ecco la sub che dovrebbe fare tutto ma il file originario è sempre disordinato, anche ricorrendo ad un file temporaneo di appoggio.
B4X:
Sub BotRiordinaFileINI_click
    Dim List1           As List
    Dim i                As Int
    Dim FileTemp        As String
   
    FileTemp=Main.GlobalCartellaAppUgo & "/" & Main.GlobalCartellaQuestaApp & "/Orario_INI_TEMP.txt"
    If File.Exists(File.DirRootExternal,FileTemp)=True Then
        File.Delete (File.DirRootExternal,FileTemp)
    End If
    List1.Initialize
    List1 = File.ReadList(File.DirRootExternal,Main.NomeFileIni)
    '--- riordino
    List1.Sort (True)
    For i=1 To List1.Size-1
        Log(List1.Get(i))
    Next
    '--- registro
    File.writelist(File.DirRootExternal,FileTemp,List1)
    File.Delete (File.DirRootExternal,Main.NomeFileIni)
    File.Copy(File.DirRootExternal,FileTemp,File.DirRootExternal,Main.NomeFileIni)
    Activity.Finish
End Sub
Inutile dire che il file Orario_INI_TEMP.txt è perfettamente ordinato, come pure il Log.

Qualche idea ?
Grazie per l'attenzione.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Ottima l'idea di rileggere il file. Difatti il file è ordinato, come è logico aspettarsi.
Ma a me appariva disordinato leggendolo con un editor di file sullo smartphone, precisamente con l'app Astro File Manager.
E sì che avevo avuto l'avvertenza di chiudere l'app e poi riaprirla, proprio per essere certo di leggere veramente quel file.
Probabilmente una questione di cache dell'app Astro ha fatto sì che prendessi un abbaglio. L'aver spento, subito dopo il mio post, ha cancellato la cache e mi ha consentito di vedere con l'editor di file che esso è perfettamente riordinato.
Grazie !

P.S.: Contrordine: ulteriori prove mi hanno fatto vedere che il file qualche volta non si riordina. Boh ?
 
Last edited:

sirjo66

Well-Known Member
Licensed User
Longtime User
non devi scrivere il file con writelist dato che una lista non ha un indice di ordinamento

Quando fai il log, scrivi la stessa cosa sul file
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Supponendo, probabilmente a ragione, che NON si debba scrivere una lista con WriteList ho sostituito il codice
B4X:
File.writelist(File.DirRootExternal,FileTemp,List1)
con una serie di istruzioni (scrivo la prima riga e poi gli "appendo" tutte le successive)
B4X:
Dim TW As TextWriter
    TW.Initialize(File.OpenOutput(File.DirRootExternal,FileTemp,False))    ' scrivo la prima riga
    TW.WriteLine (List1.Get(1))
    TW.Close
    For i=2 To List1.Size-1
        TW.Initialize(File.OpenOutput(File.DirRootExternal,FileTemp,True))  ' append
        TW.WriteLine (List1.Get(i))
        TW.Close
    Next
Il bello è che FileTemp è ordinato mentre Main.NomeFileIni non lo è.
Nemmeno evitando di usufruire di un file temporaneo ottengo un risultato positivo.
Che cavolo succede ?

Questo è il log :
Disordinato
DataPrimaInstallazione=27/10/2016 10\:32
URL6=www.nome sito della scuola/cartella per orario
UltimoDataBase=lic.sqlite
GrandezzaCarattere=10
VediInizioOre=N
Avvio=ORARIO
URL9=www.nome sito della scuola/cartella per orario
URL4=www.nome sito della scuola/cartella per orario
Versione=3.1.1
SCUOLA5=

ORDINATO
AttivaGoogleCalendar=S
Autore=Ugo Bottari - www.lalpinistavirtuale.it
Avvio=ORARIO
CancellaFileTemp=S
DataPrimaInstallazione=27/10/2016 10\:32
GrandezzaCarattere=10
NomiClassiEstesi=N
OutputSonoro=N
RicercaNuovoOrario=S
SCUOLA1=Liceo Scientifico e Classico


SECONDA PASSATA - citaz. Giorgio Gaber
Autore=Ugo Bottari - www.lalpinistavirtuale.it
Avvio=ORARIO
CancellaFileTemp=S
DataPrimaInstallazione=27/10/2016 10\:32
GrandezzaCarattere=10
NomiClassiEstesi=N
OutputSonoro=N
RicercaNuovoOrario=S
SCUOLA1=Liceo Scientifico e Classico
SCUOLA2=Istituto Tecnico Commerciale Bonelli

Come si vede il file sembrerebbe ordinato. Ma allora coma mai con l'app Astro File Manager o con l'app Total Commander io lo leggo DISORDINATO ?
Sembra quasi che il file Main.NomeFileIni abbia una "memoria" simile a quella dell'acqua (""La memoria dell'acqua è la presunta proprietà dell'acqua di mantenere un "ricordo" delle sostanze con cui è venuta in contatto"" - fonte Wikipedia)
Nemmeno riavviando lo smartphone !!!
 

udg

Expert
Licensed User
Longtime User
Ciao,
tre brevi note.
1. perchè leggi la lista dall'indice 1 invece che da 0?
2. File.delete ritorna un boolean; prova a vedere se è True e quindi l'eliminazione abbai funzionato
3. File.copy non ritorna nulla quindi dovremmo presumere che file.delete non serva e il semplice copy sovrascriva
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Risposte:
1) è un mio errore; pensavo non esistesse l'elemento zero;
2) il file Main.NomeFileIni viene effettivamente eliminato;
3) hai ragione ma, per qualche misteriosa ragione, il File.Copy non fa il suo lavoro che è fare la copia (eventualmente sovrascrivendo) di FileTemp e denominando questa copia Main.NomeFileINI. Anche se sembra assurdo "risuscita" Main.NomeFileIni, appena cancellato; o per lo meno questo è il suo effetto. Mi ritrovo Main.NomeFileIni disordinato e FileTemp ordinato. C'è da impazzire.
 

LucaMs

Expert
Licensed User
Longtime User
Prova ad eseguire il progetto passo-passo (F8) e verificare ogni volta il contenuto delle varie variabili (list).

Ho fatto una provetta (allegata) e a me sembra che WriteList funzioni bene. Ho usato i log che hai pubblicato per creare un file di testo (Orario_INI_TEMP.txt) che ho messo nella Root (usando Windows Explorer).

Dato che le righe in quel file sono ordinate (in ordine crescente) dopo averle lette passandole ad una List ho ordinato quest'ultima in ordine inverso, decrescente.
Quindi ho scritto la List in un altro file e riletto di nuovo nella List.

Mi sembra tutto ok, sia nei log che aprendo il nuovo file con un editor.
 

Attachments

  • SaveList.zip
    7 KB · Views: 264

sirjo66

Well-Known Member
Licensed User
Longtime User
@AlpVir:

secondo me stai facendo un po' di confusione tra i nomi dei files ma soprattutto sui loro contenuti.
Hai scritto:
Disordinato
DataPrimaInstallazione=27/10/2016 10\:32
URL6=www.nome sito della scuola/cartella per orario
UltimoDataBase=lic.sqlite
GrandezzaCarattere=10
VediInizioOre=N
Avvio=ORARIO
URL9=www.nome sito della scuola/cartella per orario
URL4=www.nome sito della scuola/cartella per orario
Versione=3.1.1
SCUOLA5=

ORDINATO
AttivaGoogleCalendar=S
Autore=Ugo Bottari - www.lalpinistavirtuale.it
Avvio=ORARIO
CancellaFileTemp=S
DataPrimaInstallazione=27/10/2016 10\:32
GrandezzaCarattere=10
NomiClassiEstesi=N
OutputSonoro=N
RicercaNuovoOrario=S
SCUOLA1=Liceo Scientifico e Classico

Nella sezione "ordinato" vedo le variabili AttivaGoogleCalendar, Autore, CancellaFileTemp e altre che nella sezione "Disordinato" non vedo, quindi non capisco come possa accadere

Sergio
 

AlpVir

Well-Known Member
Licensed User
Longtime User
@sirjo : le voci da indicate appaiono, nel file disordinato, oltre la decima posizione; nel Log ho elencato, per semplicità, solo le prime 8 o 10 voci.
@LucaMs : l'esempio da te realizzato funziona perfettamente, con un minimo di adattamento alla mia situazione. L'ho provato riordinando sia in senso ascendente che discendente. Al momento non riesco però a replicarlo al mio caso, anche se il farlo parrebbe semplice (sono solo 3 o 4 istruzioni). Domani riprovo.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
RISOLTO
Per qualche causa ancora sconosciuta il file INI disordinato era bloccato e non si poteva aggiornarlo, nè scrivendoci sopra nuovi dati (ordinati) nè copiandoci sopra un altro file (ordinato).
Per cui ho inserito le poche, pochissime righe che effettuano l'ordinamento del file un attimo prima della fine dell'app, proprio prima di ExitApplication.
Grazie a tutti !
 
Top