Comment couper en deux une chaine trop longue ? [Résolu]

Messages postés
262
Date d'inscription
mardi 26 février 2002
Dernière intervention
27 février 2012
- - Dernière réponse : cs_fabiano13
Messages postés
262
Date d'inscription
mardi 26 février 2002
Dernière intervention
27 février 2012
- 27 oct. 2011 à 01:34
Bonjour,

Je relance le sujet car faute de ne pas avoir trouvé de réponse.

Je cherche à couper une chaine en deux que si elle dépasse un certain nombre de caractère et si possible avec regex.

Exemple : Voici le début de ma phrase (...) et se termine ainsi.

Du genre :


System.Text.RegularExpressions.Regex.Replace(sChaine, "(?<sub>.{0,1})(?<sub>.{50})", "$1 (...) $2")

Afficher la suite 

Votre réponse

20/23 réponses

Meilleure réponse
Messages postés
262
Date d'inscription
mardi 26 février 2002
Dernière intervention
27 février 2012
3
Merci
Même tardivement, voici une solution à mon précédent problème.

Encore merci pour votre aide.
Fabiano


    Private Function ConcatenerChaine(ByVal sChaine As String, Optional ByVal Separateur As String "", Optional ByVal Max As Integer 50)
        Dim petitPoint As String = "(...)"
        Dim s1, s2, DebutChaine, FinChaine, ret As String
        ret = sChaine
        Max = Max - petitPoint.Length - 2
        If (Max Mod 2) Then Max = Max - 1
        If (sChaine.Length > Max + petitPoint.Length) Then
            If (Mid(sChaine, (Max / 2), 1) = Separateur) Then
                MsgBox(1 & ") " & Mid(sChaine, (Max / 2), 1))
                DebutChaine = Mid(sChaine, 1, (Max / 2) - 1) & Separateur
            ElseIf (Mid(sChaine, (Max / 2) - 1, 1) = Separateur) Then
                MsgBox(2 & ") " & Mid(sChaine, (Max / 2) - 1, 1))
                DebutChaine = Mid(sChaine, 1, (Max / 2) - 1)
            Else
                MsgBox(3 & ") " & Mid(sChaine, (Max / 2) - 1, 1))
                Dim tbChaine As Array = Split(Mid(sChaine, 1, (Max / 2)), Separateur)
                Dim splitChaine As String = ""
                For i As Integer = 0 To UBound(tbChaine)
                    If (i = 0) Then
                        splitChaine = tbChaine(i)
                    ElseIf (i > 0) And (i < UBound(tbChaine)) Then
                        splitChaine = splitChaine & Separateur & tbChaine(i)
                    End If
                    Application.DoEvents()
                Next
                DebutChaine = splitChaine & Separateur
            End If

            If (Mid(sChaine, sChaine.Length - (Max / 2), 1) = Separateur) Then
                FinChaine = Mid(sChaine, sChaine.Length - (Max / 2))
            ElseIf (Mid(sChaine, sChaine.Length - (Max / 2) - 1, 1) = Separateur) Then
                FinChaine = Separateur & Mid(sChaine, sChaine.Length - (Max / 2))
            Else
                Dim tbChaine As Array = Split(Mid(sChaine, sChaine.Length - (Max / 2)), Separateur)
                Dim splitChaine As String = ""
                For i As Integer = 0 To UBound(tbChaine)
                    If (i = 1) Then
                        splitChaine = tbChaine(i)
                    ElseIf (i > 1) Then
                        splitChaine = splitChaine & Separateur & tbChaine(i)
                    End If
                    Application.DoEvents()
                Next
                FinChaine = Separateur & splitChaine
            End If

            s1 = petitPoint & FinChaine
            s2 = DebutChaine & s1
            ret = [String].Format("{2}", petitPoint, s1, s2)
        End If
        Return ret & ControlChars.NewLine & ControlChars.NewLine & ret.Length
    End Function

    Private Sub Concatener_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Concatener.Click
        'MsgBox(ConcatenerChaine("Un texte est une succession de caractères organisée selon un langage. Cette définition désigne aussi bien une sémiotique du langage.", " ", 50))
        MsgBox(ConcatenerChaine("C:\Windows\System32\Boot\fi-FI\dataFiles\CurrentPath\sRoot\ModifyFile\Support\Actions\Script.vb", "", 50))
    End Sub


Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_fabiano13
Messages postés
3244
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
13 décembre 2018
3
Merci
peut etre ça

Private Function CutString(ByVal StringIn As String, ByVal longeurmax As Integer) As String
        Dim words() As String
        Dim difference As Integer
        Dim indexarray As Integer
        Dim indexstart As Integer
        Dim accumulateur As Integer
        Dim Nlettredebut As Integer
        Dim outtable As Boolean
        If StringIn.Length <= longeurmax Then
            Return StringIn
        Else
            words = StringIn.Split(" ")
            If words.Count = 1 Then
                Return StringIn
            End If
            '(...) fait aussi parti du string 
            difference = StringIn.Length - longeurmax + "(...)".Length

            ' on recherche un mot du tableau words  de la longueur la plus raprochée de différence 
            'on commence du milieu vers le début
            indexarray = words.Count \ 2
            indexstart = indexarray
            accumulateur = 0
            outtable = False
            While (accumulateur < difference)
                 '+1 on compte aussi les espaces
                accumulateur += words(indexstart).Length + 1
                If words(indexstart) = "" Then
                    accumulateur += 1
                End If
                indexstart -= 1
                If indexstart = 0 Then
                    outtable = True
                    Exit While
                End If
            End While

            'si outtable = true donc il faut supprimer les mots à partir de indexarray +1
            If outtable Then
                indexarray += 1
                While (accumulateur < difference)
                    If indexarray = words.Count Then
                        Exit While
                    End If
                    accumulateur += words(indexarray).Length
                    If words(indexarray) = "" Then
                        accumulateur += 1
                    End If
                    indexarray += 1
                End While
            End If
            accumulateur -= 1
            'calcule le nombre de lettre jusqu'à indexstart
            Nlettredebut = 0
            
            For iter As Integer = 0 To indexstart
                '+1 on compte aussi les espaces
                Nlettredebut += words(iter).Length + 1
            Next
            Nlettredebut -= 1
            Return StringIn.Substring(0, Nlettredebut) & "(...)" & StringIn.Substring(Nlettredebut + 1 + accumulateur)
        End If
    End Function


le résultat
le texte a 132 charactères
IN
Un texte est une succession de caractères organisée selon un langage. Cette définition désigne aussi bien une sémiotique du langage.
réduit à moins de 100 charactères
OUT
Un texte est une succession de(...) Cette définition désigne aussi bien une sémiotique du langage.

quand tu donnes un exemple pour illustrer ce
ça ne suffit pas pour l'algorithm
pour cela il faut bien expliquer ce que tu veux
selon tes premiers messages ce n'était évident

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_ShayW
Messages postés
14323
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
15 décembre 2018
0
Merci
Bonjour,

Chaine="123" & "456"
?

Mon site
Commenter la réponse de NHenry
Messages postés
262
Date d'inscription
mardi 26 février 2002
Dernière intervention
27 février 2012
0
Merci
Merci de bien vouloir m'aider.


Dim sChaine As String = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17"

Résulat souhaité : 1 2 3 (...) 13 14 15 16 17
Commenter la réponse de cs_fabiano13
Messages postés
14323
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
15 décembre 2018
Commenter la réponse de NHenry
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Dernière intervention
17 avril 2017
0
Merci
Bonjour fabiano13,

Je ne connais pas VB.Net mais en VB6 je ferais ceci

   Dim sChaine As String
   Dim sSep    As String
   Dim sTemp   As String
   Dim iDiv2   As Integer

   sSep = "|"
   sChaine = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17"
   iDiv2 = Len(sChaine) / 2
   sTemp = Mid$(sChaine, iDiv2, 1)
   sChaine = Replace$(sChaine, sTemp, sTemp & sSep)


A toi d'adapter...

Cheyenne
Commenter la réponse de cs_cheyenne
Messages postés
262
Date d'inscription
mardi 26 février 2002
Dernière intervention
27 février 2012
0
Merci
Merci Cheyenne pour ta réponse.

Seulement il me faut la tester avant. J'en suis sûr que regex est idéal pour ce que je veux faire.

Je trouverai tôt ou tard.

erci encore pour ton aide.
Fabiano
Commenter la réponse de cs_fabiano13
Messages postés
262
Date d'inscription
mardi 26 février 2002
Dernière intervention
27 février 2012
0
Merci
Et bien je n'ai pas encore trouver, je persiste à chercher !
Commenter la réponse de cs_fabiano13
Messages postés
3244
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
13 décembre 2018
0
Merci
Salut Fabiano

Ce n'est peut etre pas possible avec le regex
enfin pas pour ce que tu veux faire

pourquoi tu dois utiliser le regex ?
j'ai essayé ton code j'ai un peu joué avec les
parametres enfin rien parce que sans savoir ce qu'il faut écrire on tourne autours du pot
Commenter la réponse de cs_ShayW
Messages postés
3244
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
13 décembre 2018
0
Merci
Salut

en ben
es tu sur que tu ne peux pas faire plus simple
Commenter la réponse de cs_ShayW
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
salut,

d'accord avec ce que vient d'exprimer ShayW
Et ce : d'autant qu'on a là du VB.Net "à la VB6"


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
262
Date d'inscription
mardi 26 février 2002
Dernière intervention
27 février 2012
0
Merci
Je suis preneur si vous avez plus simple. Pourriez-vous m'aider ?

D'avance merci.
Fabiano
Commenter la réponse de cs_fabiano13
Messages postés
3244
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
13 décembre 2018
0
Merci
Salut Fabiano
quelques questions

tu dis si la chaine est trop longue
où la découper au milieu ,au début ?
ou sans importance
ex 123456789abcdefghijkl trop long

alors 123(...)89abcdefghijkl
ou 12345(...)abcdefghijkl
Commenter la réponse de cs_ShayW
Messages postés
3244
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
13 décembre 2018
0
Merci
Pour l'instant

Private Function CutString(ByVal StringIn As String, ByVal longeurmax As Integer) As String
'longeurmax est la longueur maximal désiré
        If StringIn.Length <= longeurmax Then
            Return StringIn
        Else
 
            Return StringIn.Substring(0, StringIn.Length \ 2) & "(...)" & StringIn.Substring(StringIn.Length \ 2 + StringIn.Length - longeurmax)
        End If
End Function
Commenter la réponse de cs_ShayW
Messages postés
262
Date d'inscription
mardi 26 février 2002
Dernière intervention
27 février 2012
0
Merci
Merci pour ton aide.

Voici 2 exemples de découpe qui ne doit pas dépasser 100 caractères :

URL : http://www.vbfrance.com/forum/sujet-COMMENT-COUPER-DEUX-CHAINE-TROP-LONGUE_1511817.aspx?p=2

Découpe URL : http://www.vbfrance.com/(...)/sujet-COMMENT-COUPER-DEUX-CHAINE-TROP-LONGUE_1511817.aspx?p=2

String : Un texte est une succession de caractères organisée selon un langage. Cette définition désigne aussi bien une sémiotique du langage.

Découpe String : Un texte est une succession (...) aussi bien une sémiotique du langage.

Je ne sais pas si tu me comprends !

Je me tiens à ta disposition.
Fabiano
Commenter la réponse de cs_fabiano13
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Découpe String : Un texte est une succession (...) aussi bien une sémiotique du langage.

Je ne sais pas si tu me comprends !

cela ressemble assez étrangement à un énoncé qui tend à préciser ce que l'on attend d'un traitement.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
3244
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
13 décembre 2018
0
Merci
ah je pense avoir compris
ce n'est pas seulement découper la chaine
mais aussi ne pas découper un mot
selon ton ex

"Un texte est une succession de caractères organisée selon un langage. Cette définition désigne aussi bien une sémiotique du langage."

selon mon code j'obtiens
"Un texte est une succession de caractères organisée selon un langa(...)si bien une sémiotique du langage."

le mot language est tronqué

bon je travaille dessus et t'envois autre chose
Commenter la réponse de cs_ShayW
Messages postés
262
Date d'inscription
mardi 26 février 2002
Dernière intervention
27 février 2012
0
Merci
Qu'est ce que tu entends par traitement ?
Commenter la réponse de cs_fabiano13
Messages postés
262
Date d'inscription
mardi 26 février 2002
Dernière intervention
27 février 2012
0
Merci
Oui effectivement, il ne coupe pas un mot en deux.

Merci pour ton aide.
Fabiano
Commenter la réponse de cs_fabiano13
Messages postés
3244
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
13 décembre 2018
0
Merci
Salut
ce n'est pas si simple
essayes

Private Function CutString(ByVal StringIn As String, ByVal longeurmax As Integer) As String
        Dim words() As String
        Dim difference As Integer
        Dim indexarray As Integer
        Dim indexstart As Integer
        Dim accumulateur As Integer
        Dim Nlettredebut As Integer
        Dim outtable As Boolean
        If StringIn.Length <= longeurmax Then
            Return StringIn
        Else
            words = StringIn.Split(" ")
            If words.Count = 1 Then
                Return StringIn
            End If
            '(...) fait aussi parti du string 
            difference = StringIn.Length - longeurmax + "(...)".Length
            ' on recherche un mot du tableau words  de la longueur la plus raprochée de différence 
            'on commence du milieu vers la fin
            indexarray = words.Count \ 2
            indexstart = indexarray
            accumulateur = 0
            outtable = False
            While (accumulateur < difference)
                If indexarray = words.Count Then
                    outtable = True
                    Exit While
                End If
                '+1 on compte aussi les espaces
                accumulateur += words(indexarray).Length + 1

                If words(indexarray) = "" Then
                    accumulateur += 1
                End If
                indexarray += 1
            End While
            'si outtable = true donc il faut supprimer les mots à partir de indexstart -1
            If outtable Then
                indexstart -= 1

                While (accumulateur < difference)
                    If indexstart = 1 Then
                        Exit While
                    End If
                    accumulateur += words(indexstart).Length
                    If words(indexstart) = "" Then
                        accumulateur += 1
                    End If
                    indexstart -= 1
                End While
            End If
            accumulateur -= 1
            'calcule le nombre de lettre jusqu'à indexstart
            Nlettredebut = 0
            If Not outtable Then
                indexstart -= 1
            End If
            For iter As Integer = 0 To indexstart
                '+1 on compte aussi les espaces
                Nlettredebut += words(iter).Length + 1
            Next
            Nlettredebut -= 1
            Return StringIn.Substring(0, Nlettredebut) & "(...)" & StringIn.Substring(Nlettredebut + 1 + accumulateur)
        End If
    End Function
Commenter la réponse de cs_ShayW

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.