Italian Aggiungere linee ad un file txt

gepo

Member
Licensed User
Salve a tutti, mi sono avvicinato da poco alla programmazione in b4a e approfitto della vostra disponibilità per farvi una domanda.
Ho bisogno di controllare se in un file txt è presente una linea di testo e se questo è True allora devo aggiungerne un'altra a capo e così via.
Ho cercato a lungo in questo forum senza trovare qualcosa di simille. Cosa mi consigliate? Grazie in anticipo a chi vorrà aiutarmi!
 

LucaMs

Expert
Licensed User
Suppongo che ti piacerebbe cercare, inserire, togliere righe direttamente; beh... non puoi :D

Puoi usare ReadList per leggere tutte le righe del file e poi gestire la cosa:
B4X:
   Dim lstRighe As List
   lstRighe.Initialize
   lstRighe = File.ReadList(File.DirInternal, "NomeFile.txt")
  
   Dim RigaDaCercare As String
   RigaDaCercare = "Essere o non essere"
  
   Dim IndexOf As Int
   IndexOf = lstRighe.IndexOf(RigaDaCercare)

   If IndexOf <> - 1 Then
       ' Trovata
       lstRighe.InsertAt(IndexOf + 1, "Riga inserita")
       ' oppure lstRighe.Add("Riga aggiunta")
   Else
       ' Non c'è
   End If
  
   File.WriteList(File.DirInternal, "NomeFile.txt", lstRighe)
 

gepo

Member
Licensed User
Grazie mille per la prontezza LucaMs! Al limite a me basterebbe sapere solo se la riga c'è senza cercarci dentro il testo...
Comunque mi metto subito al lavoro e ti faccio sapere!
 

gepo

Member
Licensed User
Buonasera LucaMs! Come promesso eccomi di nuovo qui per aggiornamenti! Dopo mille tentativi sono riuscito a trovare questa soluzione:
B4X:
Dim lstRighe As List
            lstRighe.Initialize
            lstRighe = File.ReadList(File.DirInternal, "Tavolo1.txt")
            If lstRighe.Size = 1 Then
            Dim VecchiaComanda As String
            VecchiaComanda=File.ReadString(File.DirInternal, "Tavolo1.txt")
            Dim TextWriter1 As TextWriter
            TextWriter1.Initialize(File.OpenOutput(File.DirInternal, "Tavolo1.txt", True))
            TextWriter1.WriteLine(VecchiaComanda)
            TextWriter1.WriteLine(NuovaComanda)
            TextWriter1.Close
            Else
            lstRighe.Add(NuovaComanda)
            File.WriteList(File.DirInternal, "Tavolo1.txt", lstRighe)
            
        End If
Non sarà il massimo ma sembra funzionare. Ora però dovrò trovare il modo di leggere ogni riga, inserirla in una variabile, confrontare le variabili tra di loro ecc ecc...
Se fosse possibile un'imbeccata...sarei grato a te o a chi voglia entrare nella discussione. Grazie mille!
 

LucaMs

Expert
Licensed User
Quello che vuoi fare andrebbe fatto usando un database SQLite, ma mi sa tanto che non ne hai alcuna intenzione :)

Forse ti conviene usare allora KeyValueStore2; molto semplice da usare ma ovviamente dovrai fare piccoli salti mortali se vuoi salvare una riga che corrisponda ad una "comanda" (ho imparato questo termine qui su b4x :p).

Con KeyValueStore2 salvi un valore dandogli una "chiave"; ad esempio:

Nel servizio Starter metti:
B4X:
Sub Process_Globals
   Public kvs2Tavoli As KeyValueStore
End Sub

Sub Service_Create
   kvs2Tavoli.Initialize(File.DirInternal, "Tavoli.kvs2")
End Sub
Nell'Activity che usi (anche la Main, volendo):
B4X:
    Starter.kvs2Tavoli.Put("Tav1Cmd1", "la comanda per intero")
   ' Starter.kvs2Tavoli.ListKeys
   ' Starter.kvs2Tavoli.ContainsKey
   ' Starter.kvs2Tavoli.Remove("Tav1Cmd1")
Ti ho scritto, commentati, alcuni comandi che puoi usare:

ListKeys ti elenca tutte le "chiavi" (ovvero il primo testo che usi col comando Put, in questo caso "Tav1Cmd1");
ContainsKey ti consente di verificare se una determinata "chiave" esista già (sia già stata inserita con Put);
Remove ti consente di eliminare una "riga" - nell'esempio elimineresti subito quella appena inserita.

Se hai almeno la versione 8.0 di B4A KeyValueStore2 è una libreria già disponibile, altrimenti, versioni inferiori:
https://www.b4x.com/android/forum/t...imple-powerful-local-datastore.63633/#content
 

gepo

Member
Licensed User
Molto interessante! E poi, diciamocela tutta, lavorare con dei file kvs2 dà tutta un'altra immagine rispetto ai poveri txt...:p
Ci do subito uno sguardo e vediamo cosa riesco a combinare! Grazie e alla prossima per ulteriori aggiornamenti!:)
 

gepo

Member
Licensed User
Ciao LucaMs, approfitto della tua disponibilità intanto per risolvere un dubbio. Nel forum ho trovato un vecchio thread con una tua risposta. Nel caso invece il file abbia la virgola come separatore dei campi quale potrebbe essere la procedura corretta? Questa la tua risposta:

Ciao.

Molto probabilmente puoi leggere tutto il file in un oggetto List tramite File.ReadList(Dir, NomeFile).

Fatto questo, supponendo che tu non voglia/possa usare caratteri speciali che rappresentino inizio e fine di un "campo", come ad esempio i tag che si usano qui per pubblicare codice, ovvero [ CODE ] [ / CODE ] (senza spazi), dovrai usare le funzioni stringa, nel suo esempio la SubString2 (altrimenti potresti usare altri metodi pratici).

Ad esempio (supponendo che le posizioni siano sempre le stesse in tutte le righe di testo):
B4X:
Dim lstRighe As List = File.ReadList(File.DirDefaultExternal, "NomeFile.txt")

Dim Campo1(lstRighe.Size), Campo2(lstRighe.Size) As String

Dim Riga As String
For i = 0 To lstRighe.Size - 1
   Riga = lstRighe.Get(i)
   Campo1(i) = Riga.SubString2(0, 15)
   Campo2(i) = Riga.SubString2(31, 57)
Next
Campo1() e Campo2() possono essere anche di tipo diverso da String, saranno convertiti automaticamente (magari con qualche cautela).
 

LucaMs

Expert
Licensed User
Puoi usare la funzione Split di Regex.

B4X:
Dim Stringa As String
Stringa = "ciao, come stai, tutto bene?"
Dim Parti() As String = Regex.Split(",", Stringa)
For i = 0 To Parti.Length - 1
     Log(Parti(i))
     ' Trim toglie eventuali spazi ad inizio e fine, non quelli in mezzo.
     ' Log(Parti(i).Trim)
Next
 
Top