Italian Split di una variabile text in una lista

Lello1964

Well-Known Member
Licensed User
Longtime User
dovrei splittare una varialbile lunga >200 caratteri in una lista : lis(x) specificando la lunghezza di ogni riga = 40 ch

avete una soluzione semplice ?
 

udg

Expert
Licensed User
Longtime User
Se comprendo correttamente hai, in una variabile stringa, un testo di considerevole lunghezza e desideri ridurlo in "pezzi" da 40 caratteri (o altra lunghezza designata).
Se è così, ti basta un loop che ti permette di estrarre delle substring da quella iniziale, variando solo inizio/fine di ciascun pezzo. L'ultimo avrà lunghezza inferiore.
ps: conoscendo la lunghezza del testo originale puoi "prevedere" quanti "pezzi" da 40 risulteranno ed anche la lunghezza dell'ultimo.
 

Lello1964

Well-Known Member
Licensed User
Longtime User
Questa soluzione è la più ovvia, mi riferivo a un comando tipo regex
 

udg

Expert
Licensed User
Longtime User
Vado a memoria.
.{5} prende gruppi di 5 caratteri alla volta. Prova ad inserire qualcosa del genere in Split o nei gruppi
ps: non sono al PC e non riesco a provare questa idea o altra simile.
pps: prova anche a cercare qualcosa ti po "regex split"
 

MarcoRome

Expert
Licensed User
Longtime User
B4X:
Dim lista As List = SplitString("12345abcde66666", 5)
   
    For i = 0 To lista.Size - 1
        Log(lista.Get(i))
    Next
    ....
   
   
'str = String that you want split
'targetLength = nummber char
Sub SplitString(str As String, targetLength As Int) As List
    Dim res As List
    res.Initialize
    If str.Length = targetLength Then
        res.Add(str)
        Return res
    End If

    Dim new As Int = 1
    For i = 0 To str.Length - 1 Step targetLength
        If targetLength*new > str.Length Then
            res.Add(str.SubString2(i, str.Length))
            Return res
        End If
        res.Add(str.SubString2(i, targetLength*new))
        new = new + 1
    Next
   
    Return res
End Sub

WARNING: package com.sun.javafx.embed.swing.oldimpl not in javafx.swing
Waiting for debugger to connect...
Program started.
12345
abcde
66666
 

Star-Dust

Expert
Licensed User
Longtime User
Try it ([\dA-Za-z]{3}) (or ([\W]{3}))
B4X:
DIm NumChar as int = 3
Dim Matcher1 As Matcher= Regex.Matcher($"([\dA-Za-z]{${NumChar}})"$,"111AAABBB222334445666")
Do While Matcher1.Find
    Log("Found: " & Matcher1.Match)
Loop
 
Last edited:

MarcoRome

Expert
Licensed User
Longtime User
La differenza tra le due è che nel caso in cui la stringa viene suddivisa per un numero n, se avanza un "resto" non viene restituito. Per fare un esempio:

B4X:
DIm NumChar as int = 6
Dim Matcher1 As Matcher= Regex.Matcher($"([\dA-Za-z]{${NumChar}})"$,"111AAABBB222334445666")
Do While Matcher1.Find
    Log("Found: " & Matcher1.Match)
Loop
Risultato:
WARNING: package com.sun.javafx.embed.swing.oldimpl not in javafx.swing
Waiting for debugger to connect...
Program started.
Found: 111AAA
Found: BBB222
Found: 334445

In questo caso si perde il 666

Secondo Caso:
B4X:
Dim lista As List = SplitString("111AAABBB222334445666", 6)
    
    For i = 0 To lista.Size - 1
        Log(lista.Get(i))
    Next
Risultato:
WARNING: package com.sun.javafx.embed.swing.oldimpl not in javafx.swing
Waiting for debugger to connect...
Program started.
111AAA
BBB222
334445
666
 

Star-Dust

Expert
Licensed User
Longtime User
Perdere il 666 non sarebbe male. Comunque questioni di punti di vista 🤣
 

udg

Expert
Licensed User
Longtime User
Regex.Matcher($"([\dA-Za-z]{${NumChar}})"$
Con una stringa tipo : 111*AAABBB2 22334445666
non funzionerebbe.
Al limite si potrebbe utilizzare: ([\S\s]{4})
(che prenderebbe anche eventuali ritornia capo) e poi recuperare il "resto" tramite Substring.
 
Top