Italian Aggiungere linee ad un file txt

Discussion in 'Italian Forum' started by gepo, Sep 24, 2018.

  1. gepo

    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!
     
  2. LucaMs

    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:
    Code:
    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)
     
    Sagenut likes this.
  3. gepo

    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!
     
  4. gepo

    gepo Member Licensed User

    Buonasera LucaMs! Come promesso eccomi di nuovo qui per aggiornamenti! Dopo mille tentativi sono riuscito a trovare questa soluzione:
    Code:
    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!
     
  5. LucaMs

    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:
    Code:
    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):
    Code:
    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
     
    Sagenut likes this.
  6. gepo

    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!:)
     
  7. gepo

    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:

     
  8. LucaMs

    LucaMs Expert Licensed User

    Puoi usare la funzione Split di Regex.

    Code:
    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
     
    Sagenut likes this.
  9. gepo

    gepo Member Licensed User

    Perfetto, grazie!
     
    LucaMs likes this.
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice