French lire donnée indexée dans une liste

fgh3966

Active Member
Licensed User
Bonjour

Dans ce programme à la sub private Sub Button3_Click je lis le fichier CSV et filtr la deuxième colone via l'instruction : IDchaine = ""&SecCol.SubString2(4,6), ensuite je crée une liste : listcol2 et la rempli avec l'instruction : listcol2.Add(IDchaine)
Ensuite je voudrais lire une ligne de listcol2 en espérant qu'elle soit indexé par la variable qindx.
Hélàs ça plante à l'instruction : viewchaine = listcol2.Get(qindx).

Le debugger affiche : Error occurred on line: 156 (B4XMainPage)
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1

Pourtant j'ai initialisé qindx comme un int j'ai aussi essayé de déclarer qindx dans Sub Class_Globals

Où ais je écris une bétise ?
Merci d'avance.
 

Attachments

  • TextEditorB4A.zip
    14.5 KB · Views: 62

zed

Active Member
Licensed User
Salut,
Pour être certain de travailler dans les même conditions que toi, pourrais-tu poster ton fichier CSV.
Je pourrais en créer un, mais c'est plus sûr d'utiliser le même fichier.
Merci
 

fgh3966

Active Member
Licensed User
Le fichier source que j'ai join dans le zip de tout à l'heure à 5H49:pm est un véritable bordel heuu... brouillon ;) j'espere que ça ne te donneras pas trop de difficulté.
Sinon je voudrais extraire le contenu des 2 premières colonnes du CSV et puis traiter les datas de chaque colone dans le programme avec des variable ou autre chose, enfin peu importe.
Puis quand j'arriverais a traiter la première colone normalement j'essayerais de traiter la seconde colone ainsi que les autres sans trop de difficulté.
Là j'ai joins l'original et le CSV.
Merci pour ton aide.
 

Attachments

  • testB4X.zip
    13.6 KB · Views: 60

drgottjr

Expert
Licensed User
Longtime User
une liste n'est pas exactement "indexee".
les elements d'une liste sont ajoutes l'un apres l'autre, donc "listcol2.get(quindx)" n'a aucun sens a moins que quindx ne soit pas un integer.
ex:
dim quindx as int = 0
dim element as string = listcol2.get(quindx)
ce qui retourne le premier element de la liste

pour traiter une liste tel un map, ou les elements sont, eux, indexes, il faut:
dim quindx as string = "fgh3966"
dim position as int = listcol2.indexof(quindx)
if position > -1 then
dim element as string = listcol2.get( position )
end if

seul inconvenient: le cas ou "fgh3966" existe plus d'une seule fois dans la liste.
dan ce cas-lla il faudra:

dim position as int = listcol2.indexof(quindx)
do while position > -1
dim element as string = listcol2.get( position )
log(element & " trouve a position " & position)
loop

s'il existe la possibilite qu'un element puisse exister plus d'une fois dans le meme
ensemble de donnees, il faut une liste, un map n'etant pas applicable.
 

fgh3966

Active Member
Licensed User
Dans ce cas si les élément existes plusieurs fois dans la colone ça n'a pas d'importance.
Je recherche à extraire une colonne vers un tableau d'environ 500 éléments avec qindx comme index.
 

fgh3966

Active Member
Licensed User
j'essaye d'appliquer l'exemple si dessous qu'on trouve tout en bas de ce


exemple:
Sub convCSV
    Dim su As StringUtils
    Dim list1 As List
    Dim i, acsv(20,4,2) As Int
    list1 = su.LoadCSV(File.DirAssets, "tests.txt", ",")
    Dim sCol() As String
    sCol = list1.Get(0)  'parameter value seems to have no effect
    Log(sCol.Length)   'shows correct
    For i = 0 To sCol.Length-1  'loops correctly multiple times
      acsv(i,i Mod 4,0)=sCol(i)   
    Next   
End Sub

Mais aussi je ne comprends pas bien ces deux lignes de code suivant que j'utilise "bêtement"

code incompris:
        If stringList.Get(0) <> Null Then
        seccol = stringList.Get(0)

La première ligne If stringList.Get(0) <> Null Then parcour le fichier CSV
Est ce que "seccol" peut être un string, une liste ?
Get(0) veut dire que le premier élément est pris en compte ?
Get(3) prendrait en compte la 4ième élément ?

Merci d'avance
 

drgottjr

Expert
Licensed User
Longtime User
list.get() retourne un "objet", donc ca pourra etre string, int, etc. meme une autre list...

un liste contient des objets. a toi de savoir quel objet est retourne par "list.get()".
d'habitude on ne melange pas les objets dans une liste, mais c'est faisable.

donc, on a liste de string ou une list de integer ou une list de "type custom", ...
et a chaque list.get(), l'objet de base (string, integer, quoi que ce soit) est
retourne. pour tester l'objet retourne, on utilise "if element.isinitialized then ..."
les objets retournes sont "isinitialized" faux ou vrais. pas null.


bref, et si je comprens ce que tu veux faire, essaie ce-ci:

B4X:
Sub convCSV
    Dim su As StringUtils
    Dim list1 As List
    Dim i, acsv(20,4,2) As Int
   
   
    list1 = su.LoadCSV(File.DirAssets, "testB4X.csv", ",")
    Dim sb As StringBuilder
    sb.Initialize

    For Each sarray() As String In list1
       
        For Each s As String In sarray
            sb.Append(s).Append(" ")
        Next
        sb.Append(CRLF)
    Next
   
    Log("tout le fichier, ligne par ligne, apres de-CSV:")
    Log(sb.ToString)
   
    Log("je vais extraire la 3me colonne de chaque ligne:")
    Dim listebaseesurcol2 As List
    listebaseesurcol2.Initialize
    Dim troisiemcolonne As Int = 2
   
    For Each sarray() As String In list1
        listebaseesurcol2.Add( sarray( troisiemcolonne ) )
    Next
       
    For Each s As String In listebaseesurcol2
        Log(s)
    Next
End Sub

l'image ci-jointe demontre le resultat
 

Attachments

  • list.png
    list.png
    59.9 KB · Views: 62
  • Like
Reactions: zed

zed

Active Member
Licensed User
Voici une autre approche.
Tous est dans le fichier.
 

Attachments

  • TextEditor.zip
    16 KB · Views: 66

Mahares

Expert
Licensed User
Longtime User
Un autre moyen. Pourquoi ne pas tout simplement utiliser librairie StringUtils et extraire par exemple la 3ème colonne. Voici tout le code:
B4X:
 Sub Button3_Click
    Dim su As StringUtils
    Dim list1 As List = su.LoadCSV(File.DirAssets, "testB4X.csv", ",")
    For Each sarray() As String In list1
        Log(sarray(2))
    Next
End Sub
Résultat:
TO DO
TO DO
TO DO 1
TO DO 2
TRACK TIME
TRACK TIME
TITLE
TITLE
SPARE
SPARE
SPARE
POS TIME
POS TIME
POS TIME
 
Top