French filtrage, élimination des doublons dans custom list view

fgh3966

Active Member
Licensed User
Bonjour

Graces a vos contributions j'arrive a lire puis extraire une colonne d'un fichier csv vers une custom list view :)
je recherche comment enlever les doublons et ordonner les items de la custom list view et en plus l'affichage est en hexadecimal donc de 0000 à ffff
J'ai fais des recherches et j'ai remarqué qu'une list-view est différente d'une custom-list-view.
Et lors de la compilation du code ci dessous b4a j'obtiens le message ci dessous :

Compilation du code Java. Error
B4A line: 52 >>> ( ligne 17 de l'extrait du code )
stringList.initialize2(tmp(1)) 'Regex.Split(\
src\b4a\example\b4xmainpage.java:250: error: incompatible types: String cannot be converted to List
_stringlist.Initialize2((anywheresoftware.b4a.objects.collections.List) anywheresoftware.b4a.AbsObjectWrapper.ConvertToWrapper(new anywheresoftware.b4a.objects.collections.List(), (java.util.List)(_tmp[(int) (1)])));

erreur ligne 17 dans l'exemple:
Private Sub HandleLoadResult(Result As LoadResult)
    Dim tmp() As String
    If Result.Success Then
        Try
'            Dim reader As TextReader
            reader.Initialize(File.OpenInput(Result.Dir, Result.FileName))        
            line = reader.ReadLine 'lit la première ligne
            stringList.Add(line)
            Do While line <> Null 'Tant qu'il y a des lignes dans le fichier
                line = reader.ReadLine 'lit la ligne suivante
             
                increm = increm +1        ' nombre lignes dans le CSV                
                             
                tmp = Regex.Split(",",line)
'                stringList = Regex.Split(",",line)
             
                stringList.initialize2(tmp(1)) 'Regex.Split(",",line)
                Log(stringList)


'                Bin(increm) = Bit.And(0x00ff,tmp(1))
'                stringList.sort(True)
                clv1.AddTextItem(" " &tmp(1),increm)
             
    '            clv1.AddTextItem(" " &tmp(1),increm)
            Loop
            reader.Close
    '        chainetexte = File.ReadString(Result.Dir, Result.FileName)
        Catch
            chainetexte = "Error loading file"
        End Try
    End If
End Sub

Je me suis permis de laisser les commentaire au cas où certaines personnes y trouveraient des idées pour d'autre codes
je comprends l'erreur car il ya un type de données en tant que string, un type de données en tant que listview ou custom list view.
N-y aurait-il pas un moyen de simplifier tout ça ?

Merci merci ...
 
Last edited:

fgh3966

Active Member
Licensed User
Bonsoir

Voici le csv ce serait pour traiter la colone B et je regarderais pour la colone A.

Merci
 

Attachments

  • csvB4X.zip
    444 bytes · Views: 58

Mahares

Expert
Licensed User
Longtime User
je recherche comment enlever les doublons
Voici le moyen d’ éliminer les doublons. B4XSet de la librairie interne (B4XCollections):
B4X:
Dim su As StringUtils   'need StringUtils lib checked
    Dim list1 As List = su.LoadCSV(File.DirAssets, "csvB4X.csv", ",")
    Log(" Before Remove Dupl: " & list1.Size)
    Dim MyList As List
    MyList.Initialize
    For Each s() As String In list1
        MyList.Add(ToList(s))
    Next
    Dim b4xs As B4XSet = B4XCollections.CreateSet    'need B4XCollections lib checked
    For Each objItem As Object In MyList
        b4xs.Add(objItem)
    Next
    Log("After remove dupl: " & b4xs.aslist.Size)
    For Each sss As String In b4xs.aslist
        sss=sss.Replace("[","").Replace("]","")
        Log(sss)
    Next
Before Remove Dupl: 28
After remove dupl: 21 (Sans doublons)

001, bf, TO DO , ± 99.9 , OK, 1
001, 02, TO DO, ± 199.9 , OK, 2
002, 00, TO DO 1, 0-706 , OK1, 3
002, 02, TO DO 2, 0-399.9 , OK2, 4
003, 13, TRACK TIME , 0-399.9 , TMP, 5
003, 02, TRACK TIME, 0-399.9 , TMP, 6
004, 00, TITLE , 0-99900 , DIR, 7
004, 01, TITLE, 0-99900 , DIR, 8
005, 00, SPARE, 0000-FFFF, HDEC, 9
006, 0a, SPARE, 0000-FFFF, HDEC, 10
007, 00, SPARE , 0000-FFFF, HDEC, 11
010, 3d, POS TIME, 10m-180S , SMPL, 12
010, 02, POS TIME, 10m-180S , SMPL, 13
010, 04, POS TIME, 10m-180S , SMPL, 14
001, 00, TO DO , ± 99.9 , OK, 1
001, 2b, TO DO, ± 199.9 , OK, 2
002, f9, TO DO 1, 0-706 , OK1, 3
003, 00, TRACK TIME , 0-399.9 , TMP, 5
006, 38, SPARE, 0000-FFFF, HDEC, 10
010, 00, POS TIME, 10m-180S , SMPL, 12
010, 4d, POS TIME, 10m-180S , SMPL, 14

1692957422565.png

Je n'ai pas exactement compris cette phrase: pour traiter la colone B et je regarderais pour la colone A. Quelles colonnes veux-tu montrer dans the xCustomlistview avec Addtextitem.
 
Last edited:
  • Like
Reactions: zed

fgh3966

Active Member
Licensed User
Bonsoir, Merci beaucoup.

Je voudrais traiter la colone B et l'afficher dans une CLV (custom list view)
Merci.
 
Last edited:

zed

Active Member
Licensed User
Tu vas dans le mauvais sens. Il n'y a aucun intérêt à vouloir traiter les doublons uniquement dans la colonne B.
Avant d'utiliser le fichier, il est mieux de traiter tout le fichier.
Tu as un exemple dans le post de @Mahares
Ensuite, quand le fichier complet est traiter, tu peux extraire la colonne B pour le xCLV.
Pour extraire la colonne B et l'intégrer dans un xCLV, plusieurs exemple ton déjà été montrer dans d'autres post.

Regarde
Tout ce que tu veux savoir ce trouve déjà dans tous ces post
 

fgh3966

Active Member
Licensed User
Bonjour

Merci pour vos indications, j'intégre le code de Maharès qui semble fonctionner.
Sinon Il faut filtrer et trier la colonneB et que ça apparaisse dans une Custom List View, aussi je ne sais pas si il faut que je crée un autre post, mais comment peut on désactiver le "petit tiret" qui défile sur la droite de la custom list view quand on navigue dans celle-ci ?
Merci.
 
Last edited:

fgh3966

Active Member
Licensed User
J'avais pas vu,
Merci :)

Voici mon code que j'ai adapté (bon ya mieux c'est sûr ;) )

filtrage, élimination des doublons dans custom list view:
Private Sub HandleLoadResult(result As LoadResult)
    Dim b4xs As B4XSet = B4XCollections.CreateSet    'need B4XCollections lib checked
    Dim msgload, line, tmp(), tmpp2(2048) As String
    If result.Success Then
        Try
'            Dim reader As TextReader
            reader.Initialize(File.OpenInput(result.Dir, result.FileName))          
            line = reader.ReadLine 'lit la première ligne
            Do While line <> Null 'Tant qu'il y a des lignes dans le fichier
                line = reader.ReadLine 'lit la ligne suivante              
                increm = increm +1        ' nombre lignes dans le CSV                                  
                tmp = Regex.Split(",",line)
                tmpp2(increm) = tmp(1)
            Loop
            reader.Close
        Catch
            msgload = "Error loading file"
        End Try
    End If

                For Each objItem As Object In tmpp2    'mylist
                    b4xs.Add(objItem)
                Next
'                Log("After remove dupl: " & b4xs.aslist.Size)
                For Each ss As String In b4xs.aslist
                    ss=ss.Replace("[","").Replace("]","")
'                    Log(ss)
                clv1.AddTextItem(" " &ss,increm)
                Next
End Sub

En cas de remarque n'hésitez pas.
 

Mahares

Expert
Licensed User
Longtime User
En cas de remarque n'hésitez pas.
1. Il est conseillé de ne pas utiliser TextReader. Erel conseille en général contre textreader
2. Tu n' as pas besoin de Regex.split si tu utilises StringUtils
Tu as un peu compliqué le problème. Voici the code complet et aussi le zip. Tu peux l' adapter.
B4X:
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
    Private clv1 As CustomListView
End Sub

Public Sub Initialize
'    B4XPages.GetManager.LogEvents = True
End Sub

'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")

    Dim b4xs As B4XSet = B4XCollections.CreateSet    'need B4XCollections lib checked
    Dim increm As Int
    Dim su As StringUtils  'stringutils lib checked
    Dim temp2 As List
    temp2.Initialize
    For Each s() As String In su.LoadCSV(File.dirassets, "csvb4x.csv", ",")
        temp2.Add(s(1))
    Next
    Log(temp2.Size)
    For Each objItem As Object In temp2
        b4xs.Add(objItem)
    Next
    Log(b4xs.AsList.Size)
    For Each ss As String In b4xs.aslist
        increm = increm +1
        clv1.AddTextItem(" " & ss,increm)
    Next
End Sub

Sub clv1_ItemClick (Index As Int, Value As Object)
    Log(Value)
End Sub

1693069481533.png
 

Attachments

  • xClv082623.zip
    14.8 KB · Views: 57
Last edited:

Mahares

Expert
Licensed User
Longtime User
I vaut mieux ne pas se precipiter de répondre ‘Merci’ avant d’ examiner le projet. S’il merite , marque le aver ‘like’ ou ‘solution’, bien que ce ne soit pas obligatoire. Ajouter un poste seulement avec ‘Merci’ n’indique pas que tu es satisfait avec la réponse.
 

fgh3966

Active Member
Licensed User
Bonjour

Je n'arrive pas a lire les lignes du fichier texte ou d'un fichier csv les unes après les autres.

log reader.readline:
Private Sub Button2_Click
    lineB = reader.ReadLine
    Log(lineB)
   
End Sub

Le log affiche >(null string)

Aussi Mahares m'indique : qu'il est conseillé de ne pas utiliser TextReader. Erel conseille en général contre textreader
C'est bien le même mot mais sans les majuscules, c'est bien ça ?
 

zed

Active Member
Licensed User
Dans l'exemple que tu montres, reader.readline quoi? Le reader n'a rien à lire, lineB ne peut être que null.
Qu'est-ce que tu veux faire exactement ?
Ca fait déjà un momment que tu essayes de lire des fichiers, de faire des boucles et afficher les data.
Quelque chose ne va pas ? Il y a des choses que tu ne comprends pas ?
 

Mahares

Expert
Licensed User
Longtime User
Lis poste #3 d'Erel
C'est bien le même mot mais sans les majuscules, c'est bien ça ?
Oui. C'est la même chose, majuscules ou minuscules
Lis poste #3 d'Erel ici:
 

fgh3966

Active Member
Licensed User
Je reprends les tutos
Zed peut être que le "quoi" que tu m'indique c'est sûrement la variable ou plutôt le buffer result contenant les caractères du fichier lu par HandleLoadResult(result As LoadResult)
 

fgh3966

Active Member
Licensed User
Bonsoir

je fais des recherches et a tous les exemples que je trouve on revois des lignes comme ci dessous

B4X:
TextReader1.Initialize(File.OpenInput(File.DirRootExternal, "Text.txt"))

'ou bien

 Msgbox(File.ReadString(File.DirRootExternal, "String.txt"), "")

'J'ai essayé les lignes

 dim readfichier as string

 readfichier = file.readstring(File.OpenInput(Result.Dir, Result.FileName))

' et ça ne fonctionne pas

Dans mon cas il ne faut pas que le chemin du fichier soit dans le programme mais que ce soit a l'utilisateur d'indiquer au programme où se trouve le fichier a lire.
 

zed

Active Member
Licensed User
Tu dois utiliser ContentChooser.
Exemple
B4A:
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
  
    Dim cc As ContentChooser
    
    Private mDir, mFileName As String
  
End Sub

Public Sub Initialize
'    B4XPages.GetManager.LogEvents = True
    cc.Initialize("cc")
  
    mDir = xui.DefaultFolder
End Sub

'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")

End Sub

'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.

Private Sub Button1_Click
    cc.Show("*/*", "Choose file") 'Change MIME type
End Sub

Private Sub cc_Result (Success As Boolean, Dir As String, FileName As String)
    
    If Success Then
        Log("dir = "&Dir &CRLF&"  File :  "& FileName)
                
        mFileName = GetFileInfoByIndex("_display_name", FileName)
                
        'copy to xui.DefaultFolder
        Dim InStr As InputStream = File.OpenInput("ContentDir",FileName)
        Dim OutStr As OutputStream = File.OpenOutput(mDir,mFileName,False)
        File.Copy2(InStr,OutStr)
        OutStr.Close
        
    Else
        MsgboxAsync("open file error","")
    End If

End Sub

Sub GetFileInfoByIndex(column As String, uri As String) As String
    
    Dim results As String
    Dim Cur As Cursor
    Dim Uri1 As Uri
    Dim cr As ContentResolver
    cr.Initialize("")

    'if viewing by gallery
    If uri.StartsWith("content://media/") Then
        Dim i As Int = uri.LastIndexOf("/")
        Dim id As String = uri.SubString(i + 1)
        Uri1.Parse(uri)
        Cur = cr.Query(Uri1, Null, "_id = ?", Array As String(id), Null)
        Cur.Position = 0
        If Cur.RowCount <> 0 Then
            For i = 0 To Cur.ColumnCount - 1
                If Cur.GetColumnName(i) <> Null Then
                    If Cur.GetColumnName(i) = column Then
                        results = Cur.GetString2(i)
                        Exit
                    End If
                End If
            Next
        End If
    Else
        Uri1.Parse(uri)
        Cur = cr.Query(Uri1, Null, Null, Null, Null)
        Cur.Position = 0
        If Cur.RowCount <> 0 Then
            For i = 0 To Cur.ColumnCount - 1
                If Cur.GetColumnName(i) <> Null Then
                    If Cur.GetColumnName(i) = column Then
                        results = Cur.GetString2(i)
                        Exit
                    End If
                End If
            Next
        End If
    End If
    
    Cur.Close
    
    Return results
    
End Sub
 

fgh3966

Active Member
Licensed User
Hi tout le monde.
Pour l'instant je reste avec textreader sinon je ne m'en sortirais pas.
Là je n'arrive même pas a localiser ou faire un log du buffer correspondant au fichier texte ou csv dans une autre sub que HandleLoadResult.
Juste une question : est ce bien la variable result qui contient les données du fichier ?
Impossible de faire communiquer les "variables" : reader, result avec d'autres sub seul la sub HandleLoadResult le fait ! Et je dois encore filtrer cette variable pour d'autres CLV. J'ai essayé pas mal d'options paramètrres des fonctions, duplication et copie dans une autre variable, appel de la sub comme ci dessous

ci dessous:
Sub S1
Private A As Int
A = 12
S2(A)
Log(A) ' Affiche 12
End Sub

Sub S2(B As Int)
B = 45
End Sub
 
Last edited:
Top