Forum Liberty Basic France

Général » Lecture de fichiers UTF-8 à la recherche des fins de ligne
Le 16/03/2020 à 12h30

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 601
Matinales salutations de bientôt déjà midi, passé !

- Voici un zip qui reprend tous les fichiers décrits ci-dessous, car les prendre un par un à partir du post n'est franchement pas commode -

Ça faisait un bail que je n'étais pas venu.

Avant de chercher tout seul dans mon coin, j'aimerais bien avoir votre avis sur un phénomène curieux : impossible, avec les instructions habituelles, input et line input, de détecter une fin de ligne ou un retour chariot dans un fichier texte, alors qu'un éditeur de texte lambda affiche bien le lignes interrompues là où il faut !

Depuis, j'ai appris que :
  • le fichier que je veux ouvrir est encodé en UTF-8,
  • en UTF-8, si j'ai bien compris et c'est peut-être là que ça coince, les codes ASCII traditionnels sont repris tels quels, avec le même numéro d'octet : donc je devrais pouvoir retrouver mes fins de ligne.
  • lorsque je lis le fichier caractère par caractère, en fait j'obtiens des chaines de caractères pour chaque caractère lu dans le fichier. Ces chaines de caractères sont cohérentes et correspondent, sans aucun besoin de décodage, aux données contenues dans le fichier.

Donc de tout ça, il ressort que JB/LB sait ouvrir des fichiers UTF-8, mais je ne me souviens pas avoir lu, dans l'aide, un "comment faire" pour travailler avec ces fichiers. Suis-je passé à côté ? Est-ce mon Wine sous Linux qui tente de convertir en fichier lisible par Windows ?

Voici le fichier que je veux lire (je l'ai passé en format txt à cause du forum qui ne veut pas de csv dans ses uploads, mais le résultat est le même une fois analysé par le programme)

Voici le programme de test :
  • il lit le fichier caractère par caractère
  • il est volontairement limité aux 200 premiers caractères par la variable "caralire"
  • menu "Action" - "Ouvrir CSV" pour choisir le fichier et lancer la lecture

Code VB :
 
'petite moulinette pour afficher chaque caractère lu comme s'il était un ascii

'préréglages
nomainwin
WindowWidth=800
WindowHeight=600
 
'menu
MENU #csvfg, "&Actions", "Ouvrir CSV", [ouvrir], | ,"Quitter", [quitter]
 
'pour visualisation du fichier
TEXTEDITOR #csvfg.afd, 10, 30, 765, 510
fontebasefiltre$="!font Liberation_Mono 12"
 
'ouverture de l'interface
open "Explore CSV FlightGear" for window as #csvfg
    print #csvfg.afd, fontebasefiltre$
    print #csvfg, "trapclose [quitter]"
wait
 
'fin du programme
end
 
'********* sous programmes ********
[ouvrir]
 
    print #csvfg.afd, "sp [ouvrir] : ouvrir un fichier csv FlightGear"
    FILEDIALOG "Choisir un fichier csv de FlightGear (*.csv) ", "*.csv;*.txt", chemin$
 
    'si pas de sélection par l'utilisateur
    if chemin$="" then
        print #csvfg.afd, "Annulation de l'opération par l'utilisateur"
    else
        fichier$="":car$=""
        tr=len(chemin$)
        fin=0
        while fin=0
            car$=mid$(chemin$,tr,1)
            if car$="/" or car$="\" or tr<1 then fin=1 else fichier$=car$+fichier$
            tr=tr-1
        wend
        print #csvfg.afd,"Fichier sélectionné : ";fichier$
        print #csvfg.afd,"Chemin : ";left$(chemin$,tr)
        gosub [explorer_fichier]
    end if
wait
 
[explorer_fichier]
 
    'première étape de recherche : lire les lignes du fichier et les afficher dans un texteditor
    caralire=200    'nombre de caractère à lire depuis le début du fichier
    arreter=0       'à 1, on arrête la boucle de lecture
    numcar=0        'caractère actuellement lu

    open chemin$ for input as #fic
    print #csvfg.afd,""
 
    while arreter=0
        if eof(#fic)=1 or numcar>caralire then arreter=1
        input #fic, car$
        car=asc(car$)
        print #csvfg.afd, "Caractère ";numcar;", code caractères = ";car;", caractère = ";car$
        numcar=numcar+1
    wend
 
    close #fic
    return
 
[quitter]
print "quitter"
    close #csvfg
    end
 
 


Et la sortie qu'il me présente avec le fichier disponible ici
Caché:

sp [ouvrir] : ouvrir un fichier csv FlightGear
Fichier sélectionné : fg_log_ASK21.txt
Chemin : x:\xxxx\xxxxx\progs justbasic\mes_essais\xml flightgear\graphiques

Caractère 0, code caractères = 84, caractère = Time
Caractère 1, code caractères = 65, caractère = Altitude ft
Caractère 2, code caractères = 86, caractère = V cible kt
Caractère 3, code caractères = 80, caractère = Pitch deg
Caractère 4, code caractères = 86, caractère = Vitesse verticale fps
Caractère 5, code caractères = 86, caractère = Vitesse air kts
Caractère 6, code caractères = 112, caractère = profondeur
Caractère 7, code caractères = 114, caractère = rprofondeur trim
Caractère 8, code caractères = 108, caractère = latitude
Caractère 9, code caractères = 108, caractère = longitude
1
Caractère 10, code caractères = 54, caractère = 6000
Caractère 11, code caractères = 0, caractère =
Caractère 12, code caractères = 0, caractère =
Caractère 13, code caractères = 48, caractère = 0
Caractère 14, code caractères = 51, caractère = 32
Caractère 15, code caractères = 45, caractère = -0
Caractère 16, code caractères = 48, caractère = 0
Caractère 17, code caractères = 52, caractère = 48.2982348
Caractère 18, code caractères = 52, caractère = 4.020454504
2.775
Caractère 19, code caractères = 53, caractère = 5988.768972
Caractère 20, code caractères = 0, caractère =
Caractère 21, code caractères = 0, caractère =
Caractère 22, code caractères = 45, caractère = -14.91863441
Caractère 23, code caractères = 51, caractère = 31.98637199
Caractère 24, code caractères = 45, caractère = -0
Caractère 25, code caractères = 48, caractère = 0
Caractère 26, code caractères = 52, caractère = 48.29851314
Caractère 27, code caractères = 52, caractère = 4.020414348
3.06667
Caractère 28, code caractères = 53, caractère = 5971.58441
Caractère 29, code caractères = 0, caractère =
Caractère 30, code caractères = 0, caractère =
Caractère 31, code caractères = 45, caractère = -24.70407104
Caractère 32, code caractères = 51, caractère = 36.42034531
Caractère 33, code caractères = 45, caractère = -0
Caractère 34, code caractères = 48, caractère = 0
Caractère 35, code caractères = 52, caractère = 48.29865836
Caractère 36, code caractères = 52, caractère = 4.020387689
4.01667
Caractère 37, code caractères = 53, caractère = 5932.326713
Caractère 38, code caractères = 0, caractère =
Caractère 39, code caractères = 0, caractère =
Caractère 40, code caractères = 45, caractère = -40.4215889
Caractère 41, code caractères = 52, caractère = 45.07094955
Caractère 42, code caractères = 45, caractère = -0
Caractère 43, code caractères = 48, caractère = 0
Caractère 44, code caractères = 52, caractère = 48.2988853
Caractère 45, code caractères = 52, caractère = 4.020343551
5.01667
Caractère 46, code caractères = 53, caractère = 5884.822872
Caractère 47, code caractères = 0, caractère =
Caractère 48, code caractères = 0, caractère =
Caractère 49, code caractères = 45, caractère = -55.81896973
Caractère 50, code caractères = 53, caractère = 53.76070023
Caractère 51, code caractères = 48, caractère = 0.2474440783
Caractère 52, code caractères = 48, caractère = 0
Caractère 53, code caractères = 52, caractère = 48.29909908
Caractère 54, code caractères = 52, caractère = 4.020298812
6.00833
Caractère 55, code caractères = 53, caractère = 5810.681552
Caractère 56, code caractères = 0, caractère =
Caractère 57, code caractères = 0, caractère =
Caractère 58, code caractères = 45, caractère = -101.2352982
Caractère 59, code caractères = 54, caractère = 65.13227081
Caractère 60, code caractères = 48, caractère = 0.7319864631
Caractère 61, code caractères = 48, caractère = 0
Caractère 62, code caractères = 52, caractère = 48.29931441
Caractère 63, code caractères = 52, caractère = 4.020253247
7.00833
Caractère 64, code caractères = 53, caractère = 5683.802659
Caractère 65, code caractères = 0, caractère =
Caractère 66, code caractères = 0, caractère =
Caractère 67, code caractères = 45, caractère = -148.6567535
Caractère 68, code caractères = 56, caractère = 80.93562317
Caractère 69, code caractères = 48, caractère = 0.4845728874
Caractère 70, code caractères = 48, caractère = 0
Caractère 71, code caractères = 52, caractère = 48.29942791
Caractère 72, code caractères = 52, caractère = 4.020237604
8.00833
Caractère 73, code caractères = 53, caractère = 5519.605717
Caractère 74, code caractères = 0, caractère =
Caractère 75, code caractères = 0, caractère =
Caractère 76, code caractères = 45, caractère = -179.469574
Caractère 77, code caractères = 57, caractère = 97.96032715
Caractère 78, code caractères = 45, caractère = -0
Caractère 79, code caractères = 48, caractère = 0
Caractère 80, code caractères = 52, caractère = 48.29942429
Caractère 81, code caractères = 52, caractère = 4.020255482
9.00833
Caractère 82, code caractères = 53, caractère = 5324.894816
Caractère 83, code caractères = 0, caractère =
Caractère 84, code caractères = 0, caractère =
Caractère 85, code caractères = 45, caractère = -209.7318115
Caractère 86, code caractères = 49, caractère = 114.7617645
Caractère 87, code caractères = 45, caractère = -0.2577288151
Caractère 88, code caractères = 48, caractère = 0
Caractère 89, code caractères = 52, caractère = 48.29942145
Caractère 90, code caractères = 52, caractère = 4.020273066
10.0083
Caractère 91, code caractères = 53, caractère = 5107.145944
Caractère 92, code caractères = 0, caractère =
Caractère 93, code caractères = 0, caractère =
Caractère 94, code caractères = 45, caractère = -217.4860535
Caractère 95, code caractères = 49, caractère = 130.5465393
Caractère 96, code caractères = 45, caractère = -0.3401898146
Caractère 97, code caractères = 48, caractère = 0
Caractère 98, code caractères = 52, caractère = 48.2995591
Caractère 99, code caractères = 52, caractère = 4.020250279
11.0083
Caractère 100, code caractères = 52, caractère = 4910.981045
Caractère 101, code caractères = 0, caractère =
Caractère 102, code caractères = 0, caractère =
Caractère 103, code caractères = 45, caractère = -162.3964386
Caractère 104, code caractères = 49, caractère = 142.4417267
Caractère 105, code caractères = 45, caractère = -0.3401898146
Caractère 106, code caractères = 48, caractère = 0
Caractère 107, code caractères = 52, caractère = 48.29997621
Caractère 108, code caractères = 52, caractère = 4.020145587
12
Caractère 109, code caractères = 52, caractère = 4800.954136
Caractère 110, code caractères = 0, caractère =
Caractère 111, code caractères = 0, caractère =
Caractère 112, code caractères = 45, caractère = -52.68309021
Caractère 113, code caractères = 49, caractère = 147.2226562
Caractère 114, code caractères = 45, caractère = -0.3401898146
Caractère 115, code caractères = 48, caractère = 0
Caractère 116, code caractères = 52, caractère = 48.30061672
Caractère 117, code caractères = 52, caractère = 4.019971945
13
Caractère 118, code caractères = 52, caractère = 4800.312201
Caractère 119, code caractères = 0, caractère =
Caractère 120, code caractères = 0, caractère =
Caractère 121, code caractères = 52, caractère = 44.74378204
Caractère 122, code caractères = 49, caractère = 144.4327087
Caractère 123, code caractères = 45, caractère = -0.2680440545
Caractère 124, code caractères = 48, caractère = 0
Caractère 125, code caractères = 52, caractère = 48.30134933
Caractère 126, code caractères = 52, caractère = 4.019765748
14
Caractère 127, code caractères = 52, caractère = 4890.173233
Caractère 128, code caractères = 0, caractère =
Caractère 129, code caractères = 0, caractère =
Caractère 130, code caractères = 49, caractère = 130.6782074
Caractère 131, code caractères = 49, caractère = 135.368988
Caractère 132, code caractères = 45, caractère = -0.2370983064
Caractère 133, code caractères = 48, caractère = 0
Caractère 134, code caractères = 52, caractère = 48.30200319
Caractère 135, code caractères = 52, caractère = 4.019576413
15
Caractère 136, code caractères = 53, caractère = 5041.360722
Caractère 137, code caractères = 0, caractère =
Caractère 138, code caractères = 0, caractère =
Caractère 139, code caractères = 49, caractère = 167.293335
Caractère 140, code caractères = 49, caractère = 121.5502396
Caractère 141, code caractères = 45, caractère = -0.2370983064
Caractère 142, code caractères = 48, caractère = 0
Caractère 143, code caractères = 52, caractère = 48.30249897
Caractère 144, code caractères = 52, caractère = 4.019428015
16
Caractère 145, code caractères = 53, caractère = 5212.929752
Caractère 146, code caractères = 0, caractère =
Caractère 147, code caractères = 0, caractère =
Caractère 148, code caractères = 49, caractère = 171.8251648
Caractère 149, code caractères = 49, caractère = 105.0541611
Caractère 150, code caractères = 45, caractère = -0.2164983004
Caractère 151, code caractères = 48, caractère = 0
Caractère 152, code caractères = 52, caractère = 48.30282617
Caractère 153, code caractères = 52, caractère = 4.019325706
17
Caractère 154, code caractères = 53, caractère = 5376.935475
Caractère 155, code caractères = 0, caractère =
Caractère 156, code caractères = 0, caractère =
Caractère 157, code caractères = 49, caractère = 154.1837769
Caractère 158, code caractères = 56, caractère = 87.37545013
Caractère 159, code caractères = 45, caractère = -0.1752372831
Caractère 160, code caractères = 48, caractère = 0
Caractère 161, code caractères = 52, caractère = 48.30301637
Caractère 162, code caractères = 52, caractère = 4.019261954
18
Caractère 163, code caractères = 53, caractère = 5517.488675
Caractère 164, code caractères = 0, caractère =
Caractère 165, code caractères = 0, caractère =
Caractère 166, code caractères = 49, caractère = 126.4604034
Caractère 167, code caractères = 54, caractère = 69.44045258
Caractère 168, code caractères = 45, caractère = -0.2370983064
Caractère 169, code caractères = 48, caractère = 0
Caractère 170, code caractères = 52, caractère = 48.3031173
Caractère 171, code caractères = 52, caractère = 4.019223913
19
Caractère 172, code caractères = 53, caractère = 5628.285268
Caractère 173, code caractères = 0, caractère =
Caractère 174, code caractères = 0, caractère =
Caractère 175, code caractères = 57, caractère = 94.81073761
Caractère 176, code caractères = 53, caractère = 51.55422211
Caractère 177, code caractères = 45, caractère = -0.2886440754
Caractère 178, code caractères = 48, caractère = 0
Caractère 179, code caractères = 52, caractère = 48.30315418
Caractère 180, code caractères = 52, caractère = 4.019204741
20
Caractère 181, code caractères = 53, caractère = 5706.328789
Caractère 182, code caractères = 0, caractère =
Caractère 183, code caractères = 0, caractère =
Caractère 184, code caractères = 54, caractère = 61.51327515
Caractère 185, code caractères = 51, caractère = 34.07481003
Caractère 186, code caractères = 45, caractère = -0.3092745841
Caractère 187, code caractères = 48, caractère = 0
Caractère 188, code caractères = 52, caractère = 48.30315097
Caractère 189, code caractères = 52, caractère = 4.019197829
21
Caractère 190, code caractères = 53, caractère = 5751.708763
Caractère 191, code caractères = 0, caractère =
Caractère 192, code caractères = 0, caractère =
Caractère 193, code caractères = 50, caractère = 29.66073608
Caractère 194, code caractères = 49, caractère = 17.32580757
Caractère 195, code caractères = 45, caractère = -0.3092745841
Caractère 196, code caractères = 48, caractère = 0
Caractère 197, code caractères = 52, caractère = 48.303139
Caractère 198, code caractères = 52, caractère = 4.019194109
22
Caractère 199, code caractères = 53, caractère = 5766.478378
Caractère 200, code caractères = 0, caractère =
Caractère 201, code caractères = 0, caractère =

(j'ai remplacé des données perso par des "xxxx")

Obtenez-vous la même chose ?



Edité par Christophe Le 16/03/2020 à 12h57
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 16/03/2020 à 13h51

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2199
JB lit les ".txt"
J"ai pris tes fichiers, je les ai renommés "csv.txt"; "utf".txt"
Je l'ai ai ouverts avec la procédure courante et tout se passe bien
Ensuite j'ai remplacé les virgules par des espaces pour "aérer" et voir quoi correspondait à quoi; mais je n'ai pas trouvé combien il y avait de paramètres
11 param en en-tête et 8 dans le texte ?
"Time Altitude ft V cible kt Pitch deg Vitesse verticale fps Vitesse air kts profondeur rprofondeur trim latitude longitude
1 6000 0 32 -0 0 48.2982348 4.020454504"
????????

Code VB :
 
     NOMAINWIN
    WindowWidth = 600: WindowHeight = 400
    UpperLeftX = 10: UpperLeftY = 20
    TEXTEDITOR #w.te, 10, 20, 500, 330
    GRAPHICBOX #w.m 5, 5, 585, 360
    OPEN "Help" FOR window_nf AS #w
    #w, "TRAPCLOSE [closeHelp]"
   ' #w.m, "when leftButtonDown [scanne]"
    #w.m  "down;fill darkred"
    #w.m, "when leftButtonMove [scanne]"
    open "utf.txt" for input as #g
        while eof(#g)=0
        line input #g, lesdonnées$
       #w.te, lesdonnées$ 
        wend
        close #g
    wait
  wait
  [closeHelp]
    CLOSE  #w
    END
 
____________________
Roro

   
Le 16/03/2020 à 15h23

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 601
C'est parce que tu as enlevé les virgules, que tu ne trouves plus le bon nombre de données, la virgule est le séparateur.

Tu devrais avoir 9 virgules par ligne, donc 10 données. Une fois tout remis en place, on devrait avoir, pour la première ligne de données :

time : 1 seconde (l'instant "t" auquel les paramètres sont écrits dans la ligne)
Altitude ft : 6000
V cible kt : <rien> (vitesse à atteindre programmée dans le pilote automatique)
Pitch deg : <rien> (paramètre calculé par le pilote auto pour respecter la vitesse cible)
Vitesse verticale fps : 0 (normal, tout début de la simu)
Vitesse air kts : 32 (vitesse pour simu démarrant à 6000 ft)
profondeur : -0 (angle à l'instant "t" de braquage de la gouverne de profondeur)
rprofondeur trim : 0 (idem pour le trim de profondeur)
latitude : 48.29851314
longitude : 4.020414348

Puis c'est pareil pour toutes les autres lignes, et on obtient un fichier de données organisées en colonnes, chaque ligne stockant les valeurs des paramètres telles qu'elles étaient à un "t" où on les a écrites. Le but est d'afficher des courbes comme on le ferait avec un tableur, mais sans se coltiner la procédure d'importation de fichier CSV dans le tableur, ni devoir se contenter des graphiques qu'il propose.


Pour revenir au problème actuel, c'est à n'y rien comprendre, ton prog fonctionne chez moi. Donc Wine n'y est pour rien, et la lecture de l'utf n'est pas un problème...

Je ne comprend pas pourquoi la première mouture que j'avais réalisé, malgré l'instruction "line input", mettait toutes les lignes les unes après les autres, comme s'il ne détectait pas la fin de ligne, et que mon compteur de ligne restait invariablement à 1... Je vais voir ce qui a coincé.

Quant à l'exemple que j'ai posté, il est particulièrement édifiant : comment, en lisant seulement 1 caractère, le contenu de celui-ci est une chaine de caractères bien existante dans le fichier, et qu'en lisant le caractère suivant on trouve la chaine de caractère suivante ? Il y a là un mode de lecture de fichier que je ne connaissais pas.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 16/03/2020 à 15h27

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 601
C'est peut-être une longueur de donnée qui se gère automatiquement; et là ou je crois que le programme a lu un seul octet, il en a lu plusieurs et s'est arrêté lorsqu'il a rencontré un caractère de fin.

Je suis un peu rouillé, il y a longtemps que je n'ai plus pratiqué les fichiers
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 16/03/2020 à 15h56

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2199
Et comme ça ?
En prenant des espaces comme séparateurs et en mettant des "_" là où il faut dans l'en-tête
Time Altitude_ft V_cible_kt Pitch_deg Vitesse_verticale_fps Vitesse_air_kts profondeur rprofondeur trim latitude longitude
( Pour remplacer j'utilise ça-->: http://libertybasic.fr/forum/topic-469+recenser-remplacer.php#m5381 )
Code VB :
 
     NOMAINWIN
    WindowWidth = 900: WindowHeight = 400
    UpperLeftX = 10: UpperLeftY = 20
    TEXTEDITOR #w.te, 10, 20, 800, 330
    GRAPHICBOX #w.m 5, 5, 885, 360
    OPEN "Help" FOR window_nf AS #w
    #w, "TRAPCLOSE [closeHelp]"
  dim t$(100)
    #w.m  "down;fill darkred"
    open "uttf.txt" for input as #g
        line input #g, entete$
        #w.te, entete$
        #w.te, " "
         while eof(#g)=0
       line input #g, lesdonnées$ 
       n=n+1: t$(n)=lesdonnées$
        wend
        close #g
        for x=1 to n
          for c=1 to 10
          #w.te, word$(entete$,c);": ";word$(t$(x),c)
          next c
           #w.te, "------------------"
        next x
    wait
  wait
  [closeHelp]
    CLOSE  #w
    END
 

Ou comme ça ?
Code VB :
 
     NOMAINWIN
    WindowWidth = 900: WindowHeight = 400
    UpperLeftX = 10: UpperLeftY = 20
    TEXTEDITOR #w.te, 10, 20, 800, 330
    GRAPHICBOX #w.m 5, 5, 885, 360
    OPEN "Help" FOR window_nf AS #w
    #w, "TRAPCLOSE [closeHelp]"
  dim t$(100)
    #w.m  "down;fill darkred"
    open "uttf.txt" for input as #g
        line input #g, entete$
        #w.te, entete$
        #w.te, " "
         while eof(#g)=0
       line input #g, lesdonnées$ 
       n=n+1: t$(n)=lesdonnées$
        wend
        close #g
        for x=1 to n
          for c=1 to 10
          #w.te, word$(entete$,c);": ";word$(t$(x),c);" / ";
          next c
          #w.te, " "
        next x
    wait
  wait
  [closeHelp]
    CLOSE  #w
    END
 
____________________
Roro

   
Le 17/03/2020 à 18h17

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 601
Ca pourrait le faire, mais je suis obligé de prendre le fichier tel qu'il se présente, toute autre manipulation préalable annulerait la facilité d'utilisation que j’attends de mon futur bout de programme.

Et j'ai compris pourquoi mon prog ne fonctionnait pas comme prévu.

Déjà, dans le programme, il y a deux erreurs dans la boucle de lecture du fichier :
Code VB :
 
    while arreter=0
        if eof(#fic)=1 or numcar>caralire then arreter=1
        input #fic, car$
        car=asc(car$)
        print #csvfg.afd, "Caractère ";numcar;", code caractères = ";car;", caractère = ";car$
        numcar=numcar+1
    wend
 

D'abord, la valeur de eof(#fichier) ne vaut pas 1, mais :
  • soit 0 -> on n'est pas encore à la fin du fichier
  • soit -1 -> on a atteint la fin du fichier

et on pouvait donc boucler à l'infini, heureusement que j'avais prévu le nombre maxi de caractère à lire avec la variable caralire.

Ensuite, je voulais ne lire qu'un caractère à la fois, pour trouver cette fameuse fin de ligne que LINE INPUT ne détectait pas. Or, l'instruction à utiliser pour ne lire qu'un caractère à la fois est INPUT$(#alias,1), et non INPUT #alias, car$. Si j'en crois l'exécution du programme, cette seconde instruction met dans car$ tous les caractères rencontrés jusqu'à la virgule suivante.

A noter que je viens de voir INPUTCSV dans l'aide. Ca doit être une nouveauté de JB2, puisque je ne me souviens pas de l'avoir vu auparavant.

LINE INPUT ne fonctionnait donc pas. L'explication est toute simple : le fichier à lire vient du monde Unix, où l'on change de ligne par un chr$(10), alors que LINE INPUT vient de JustBasic, donc du monde DOS-Windows, où l'on utilise chr$(13)+chr$(10).

Alors forcément, dans un fichier démuni de chr$(13), LINE INPUT ne trouve qu'une ligne.

Pour illustrer cette affirmation :
(le programme créée successivement un fichier Windows et un fichier Unix, et tente de les lire en utilisant LINE INPUT)
Code VB :
 
 
'génère fichier
fichier$="test_line_input_Windows.txt"
 
'on génère le fichier à la mode Dos/Windows
open fichier$ for output as #f
    print #f, "la jument"+chr$(13)+chr$(10);
    print #f, "de michaut"+chr$(13)+chr$(10);
    print #f, "s'en"+chr$(13)+chr$(10);
    print #f, "repentira"
close #f
 
'puis on le relit
print:print "LINE INPUT avec un fichier DOS/Windows :"
open fichier$ for input as #f
ligne=0
while eof(#f)=0
    line input #f, item$
 
    ligne=ligne+1
    print "ligne n°";ligne;"-";item$ 
wend
close #f
 
 
fichier$="test_line_input_Unix.txt"
'maintenant
'on génère le fichier à la mode Unix
open fichier$ for output as #f
    print #f, "la jument"+chr$(10);
    print #f, "de michaut"+chr$(10);
    print #f, "s'en"+chr$(10);
    print #f, "repentira"
close #f
 
'puis on le relit
print:print "LINE INPUT avec un fichier Unix :"
open fichier$ for input as #f
ligne=0
while eof(#f)=0
    line input #f, item$
 
    ligne=ligne+1
    print "ligne n°";ligne;"-";item$ 
wend
close #f
 


Comme quoi c'était pas si compliqué, je vais pouvoir avancer...



Edité par Christophe Le 17/03/2020 à 18h32
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 18/03/2020 à 09h46

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2199
A la bonne heur, tu fais dans l'aéronautique ?
____________________
Roro

   
Le 18/03/2020 à 22h53

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 601
Oui, à mes moments perdus :


C'est sur FlightGear et c'est en mode "relax" entre deux trucs chiants, et comme on peut piloter à la souris, il n'y a pas besoin de sortir le joystick encombrant plein de fils qui s'entortillent ;)

Je ne fabrique pas les avions, je me contente de les piloter...

Pour le problème du fichier unix, il semble qu'il n'y ait que la lecture caractère par caractère qui fonctionne pleinement.

On a vu qu'on ne pouvait pas se servir de LINE INPUT, et un INPUT #alias,variable$ semble prometteur puisqu'il fournit la donnée qui se trouve entre les virgules, ce qui est tout à fait ce que je souhaite, et s'il peut le faire par construction, c'est génial. Malheureusement, il ne détecte pas la fin de ligne non plus, ce qui fait que la première donnée de la ligne suivante est collée à la dernière donnée de la ligne en cours. Donc il faut lire caractère par caractère, et gérer nous-même le chr$(10)

A noter que FlightGear tourne aussi sous Windows, et qu'un fichier de paramètres de vol issu d'un FG sous Windows devrait être beaucoup plus simple à lire ;)

Autrement, je n'ai pas trop perdu la main, et je devrais pouvoir afficher mes courbes dans les jours qui viennent. Il faudrait pratiquer plus souvent, pour ne pas passer des jours à reconstruire l'évidence.



Edité par Christophe Le 18/03/2020 à 23h03
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 19/03/2020 à 10h58

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2199
C'est pas plus simple de mettre le fichier en ".txt" et d'intégrer dans ton soft la détection de la virgule ça t'éviterait le soucis des fins de lignes. (et une possible "diablerie" du: "INPUT #alias,variable$"); et te réconcilierait avec le convivial "line input".

J'ai un ami qui donne des leçons de parapente, mais comme une fois il n'est pas passé loin d'une ligne haute tension, je préfère m'abstenir de vol à voile; prudence est mère de sûreté ^^
____________________
Roro

   
Le 19/03/2020 à 14h43

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 601
Citation:
C'est pas plus simple de mettre le fichier en ".txt" et d'intégrer dans ton soft la détection de la virgule
Non, parce que ça obligerait à faire des manipulations préalables, et que je veux juste charger le fichier et laisser le programme s'occuper du reste ;)

J'ai opté pour l'analyse caractère par caractère, avec chr$(44) en séparateur de donnée et chr$(10) comme fin de ligne. Il reste à concevoir le système de graphiques, mais comme j'ai déjà fait avec d'autres essais, ça devrait pas être trop compliqué.

J'ai découvert (ou re-découvert) la souplesse des tableaux multidimensionnels, ceux qu'on initialise sous la forme dim tableau(a,b) : quel que soit le nombre de colonnes présentes dans le fichier, le tableau peut accueillir toutes ses données, il suffit de le dimensionner une fois qu'on a trouvé le nombre de colonnes dans le fichier. Je n'ai pas testé avec 1000 colonnes, cependant...

Voici la chose dans son état actuel, pour les curieux :

Code VB :
 
'lecture et affichage des données den fichiers csv généré par FlightGear

'préréglages
nomainwin
Version$="0.01"
'0.01 - mise en place de l'environnement, fonctionnement de l'importation des données
'0.02 - déterminer mini et maxis pour l'affichage basique des courbes, les afficher,
'0.03 - mise à l'échelle, graduation des axes
'0.04 - faire correspondre les colonnes lues avec les unités et nom de données de Flightgear
'1.00 - version 0.xx aboutie

'définition de l'interface
'taille de la fenêtre
WindowWidth=1000
WindowHeight=600
 
'menu
MENU #p, "&Actions", "Ouvrir CSV", [ouvrir], | ,"Quitter", [quitter]
 
'visualisation des détails techniques des opérations
TEXTEDITOR #p.te, 10, 325, 965, 180
fontebasefiltre$="!font Liberation_Mono 12"
 
'afficheur de courbes
graphicbox #p.gb,500,20,470,280
 
'lister et choisir les données

'données initiales
[titre_col] data "","< choisir >"
gosub [prerempli_cbbox]
 
'abscisse
STATICTEXT #p.stabs, "Abscisse", 20, 20, 100, 20
COMBOBOX #p.cbabs, titre$(), [combo_abs], 20, 50,120, 20
TEXTEDITOR #p.teabs, 20, 80, 120, 240
 
'courbe 1
STATICTEXT #p.stc1, "Courbe 1", 160, 20, 100, 20
COMBOBOX #p.cbc1, titre$(), [combo_c1], 160, 50, 120, 20
BUTTON #p.bc1, "ON", [c1_onoff], UL, 160, 80 , 45, 20
BUTTON #p.bcoul1, " ", [c1_couleur], UL, 210, 80 , 45, 20
TEXTEDITOR #p.tec1, 160, 120, 120, 240
 
'courbe 2
STATICTEXT #p.stc2, "Courbe 2", 280, 20, 100, 20
COMBOBOX #p.cbc2, titre$(), [combo_c2], 280, 50, 120, 20
BUTTON #p.bc2, "ON", [c2_onoff], UL, 280, 80 , 45, 20
BUTTON #p.bcoul2, " ", [c2_couleur], UL, 330, 80 , 45, 20
TEXTEDITOR #p.tec2, 280, 120, 120, 240
 
'ouverture de l'interface
open "Explore CSV FlightGear" for window as #p
 
    'police de caractère du texteditor
    print #p.te, fontebasefiltre$
 
    'état des boutons, combo et texteditor au départ
    gosub [initialisation]
 
    'quitter par le gadget de fermeture
    print #p, "trapclose [quitter]"
 
wait
 
'fin du programme
end
 
'********* sous programmes ********

' **** initialisation

[prerempli_cbbox]
    restore [titre_col]
    for a=0 to 1
        read a$
        titre$(a)=a$
    next
    return
 
[initialisation]
    '   (je sais, "print" est optionnel)
    'abscisse
    print #p.cbabs, "selectindex ";0
    print #p.cbabs, "disable"
    print #p.teabs, "!disable"
 
    'courbe 1
    print #p.bc1, "!disable"
    print #p.cbc1, "selectindex ";0
    print #p.cbc1, "disable"
    print #p.tec1, "!disable"
 
    'courbe 2
    print #p.bc2, "!disable"
    print #p.cbc2, "selectindex ";0
    print #p.cbc2, "disable"
    print #p.tec2, "!disable"
 
    'informations au lancement
    print #p.te, "<Lire-CSV-FlightGear>, version ";Version$
    print #p.te, "Création de graphiques à partir de données de vol"
    print #p.te, ""
    print #p.te, "Menu "+chr$(34)+"Actions/ouvrir CSV"+chr$(34)+" pour charger un fichier de données"
 
    return
 
[ouvrir]
print "ouvrir"
    print #p.te, "sp [ouvrir] : ouvrir un fichier csv FlightGear"
 
    FILEDIALOG "Choisir un fichier csv de FlightGear (*.csv) ", "*.csv;*.txt", chemin$
 
    'si pas de sélection par l'utilisateur
    if chemin$="" then
        print #p.te, "Annulation de l'opération par l'utilisateur"
    else
        fichier$="":car$=""
        tr=len(chemin$)
        fin=0
        while fin=0
            car$=mid$(chemin$,tr,1)
            if car$="/" or car$="\" or tr<1 then fin=1 else fichier$=car$+fichier$
            tr=tr-1
        wend
        print #p.te,"Fichier sélectionné : ";fichier$
        print #p.te,"Chemin : ";left$(chemin$,tr)
        gosub [explorer_fichier]
        gosub [preparer_affichage_donnees]
    end if
wait
 
[explorer_fichier]
 
    'on ne peut pas utiliser LINE INPUT car le fichier à lire vient du monde UNIX
    'on lit donc caractère par caractère jusqu'à trouver la fin de ligne
    'on stocke les caractères dans une chaine
    'on compte les virgules dans la ligne, on ajoute 1 pour le nombre de données par ligne

    open chemin$ for input as #fic
    print #p.te,""
 
    'déterminer le nombre de colonnes présentes dans le fichier
    'lecture caractère par caractère pour raisons de compatibilité avec le monde Linux
    arreter=0
    virgule=0
    while arreter=0
        car$=input$(#fic,1)
        if car$=chr$(44) then virgule=virgule+1
        if car$=chr$(10) then findeligne=1
        if eof(#fic)=-1 or findeligne=1 then arreter=1
    wend
 
    'déterminer le nombre de lignes de données dans le fichier
    nombredelignes=0
    while eof(#fic)=0
        if input$(#fic,1)=chr$(10) then nombredelignes=nombredelignes+1
    wend
    close #fic
 
    nombredecolonnes=virgule+1
 
    'créer le tableau multidimensionnel
    dim lefichier$(nombredelignes+1,nombredecolonnes)
 
    'remplir le tableau avec les données du fichier
    ligne=0
    colonne=0
    mot$=""
 
    open chemin$ for input as #fic
    while eof(#fic)=0
 
        car$=input$(#fic,1)
 
        if car$<>chr$(10) then      'nous ne sommes pas au bout de la ligne
            if car$=chr$(44) then   'virgule, le mot précédent la virgule est terminé
                lefichier$(ligne,colonne)=mot$
                mot$=""
                colonne=colonne+1
            else    'on complète le mot
                mot$=mot$+car$
            end if
 
        else    'on change de ligne
            lefichier$(ligne,colonne)=mot$
            mot$=""
            ligne=ligne+1
            colonne=0
        end if
    wend
    close #fic
 
    return
 
[preparer_affichage_donnees]
 
    'mettre les entetes de colonne en tableau
    'garder les entrées initiales, et ajouter les en-tete de colonne
    dim titre$(nombredecolonnes+1)
    gosub [prerempli_cbbox]
 
    for a=2 to nombredecolonnes+1
        titre$(a)=lefichier$(0,a-2)
    next
 
    'réactualiser les combobox avec les nouveaux en-tetes
    print #p.cbabs, "reload"
    print #p.cbc1, "reload"
    print #p.cbc2, "reload"
 
    'autoriser l'utilisation des commandes de gestion des courbes
    'abscisse
    print #p.cbabs, "enable"
    print #p.cbabs, "selectindex ";1
    print #p.teabs, "!enable"
 
    'courbe 1
    print #p.bc1, "!enable"
    print #p.cbc1, "enable"
    print #p.cbc1, "selectindex ";1
 
    print #p.tec1, "!enable"
 
    'courbe 2
    print #p.bc2, "!enable"
    print #p.cbc2, "enable"
    print #p.cbc2, "selectindex ";1
    print #p.tec2, "!enable"
 
    return
 
[afficher_les_données]
    return
 
' **** lister les données et décider de les afficher

[combo_abs]     'choisir l'axe des abscisses
    print #p.teabs, "!cls"
    print #p.cbabs, "selectionindex? index"    'colonne sélectionnée
    for a=1 to nombredelignes
        print #p.teabs,lefichier$(a,index-2)
    next
    print #p.teabs, "!origin ";0;" ";0
    wait
 
[c1_onoff]      'courbe 1 marche/arret
    wait
 
[c1_couleur]    'courbe 1 couleur
    wait
 
[combo_c1]      'choisir la colonne de données pour la courbe 1
    print #p.tec1, "!cls"
    print #p.cbc1, "selectionindex? index"    'colonne sélectionnée
    for a=1 to nombredelignes
        print #p.tec1,lefichier$(a,index-2)
    next
    print #p.tec1, "!origin ";0;" ";0
    wait
 
[c2_onoff]      'courbe 2 marche/arret
    wait
 
[c2_couleur]    'courbe 2 couleur
    wait
 
[combo_c2]      'choisir la colonne de données pour la courbe 2
    print #p.tec2, "!cls"
    print #p.cbc2, "selectionindex? index"    'colonne sélectionnée
    for a=1 to nombredelignes
        print #p.tec2,lefichier$(a,index-2)
    next
    print #p.tec2, "!origin ";0;" ";0
    wait
 
' **** quitter
[quitter]
print "quitter"
    close #p
    end
 
 
 


Hep ! C'est l'ami, pas toi, qui a failli se manger une ligne électrique, ton argument n'est pas valable, tu peux voler en toute prudence ;) Ceci dit, il doit s'en souvenir encore.



Edité par Christophe Le 19/03/2020 à 14h47
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 19/03/2020 à 15h51

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2199
Citation:
Non, parce que ça obligerait à faire des manipulations préalables, et que je veux juste charger le fichier et laisser le programme s'occuper du reste

Le changement d'extension peut être fait dans le soft avec "Name a$ as b$" (il faut mettre un flag pour sauter le renommage quand il a été fait).
J'ai testé la capacité tableau, ça a l'air de coincer au dessus de 100 000
Citation:
il suffit de le dimensionner une fois qu'on a trouvé le nombre de colonnes dans le fichier.

Et de lignes.

J'ai pris ton dernier code, je l'ai mis avec le contenu du zip du premier msg, j'ai fait "action" avec les deux fichiers (csv et utf8); j'ai cliqué un peu partout (time en abcisse, altitude -->"on".
Pas de courbe pour l'instant, normal ça reste à faire.
A première vue je trouve ton code un peu long pour ce qu'il fait
____________________
Roro

   
Le 20/03/2020 à 14h22

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2199
Ou plus simple le renommer en ".csv" en sortie du prog
Je comprends pas pourquoi il ne veut pas me mettre les "///" entre chaque donnée à l'affichage
Ni d'une façon, ni de l'autre.
J'ai fait la même chose sans fichier (en remplissant le tableau en dur) et il les met; va comprendre..?
Code VB :
 
  NOMAINWIN
    WindowWidth = 900: WindowHeight = 400
    UpperLeftX = 10: UpperLeftY = 20
    TEXTEDITOR #w.te, 10, 20, 800, 330
    GRAPHICBOX #w.m 5, 5, 885, 360
    OPEN "Help" FOR window_nf AS #w
    #w, "TRAPCLOSE [closeHelp]"
    #w.m  "down;fill darkred"
    name "fg_log_ASK21.csv" as "fg_log_ASK21.txt"
    n=0
    open "fg_log_ASK21.txt" for input as #g
        line input #g, entete$
        #w.te, entete$
        #w.te, " "
        while eof(#g)=0  'comptage des données
          n=n+1: line input #g, lesdonnées$ 
        wend
        close #g
        '-------------
        dim tableau$(n,1000): dim t$(n+1)
        n=0
    open "fg_log_ASK21.txt" for input as #h ' lecture
        line input #h, entete$
         while eof(#h)=0
       line input #h, lesdonnées$ 
       n=n+1: t$(n)=lesdonnées$
        wend
    close #h
          for a=1 to n
            lign$=""
            for b=1 to len(t$(a))
            if mid$(lesdonnées$,b,1)="," then 'détection ","
              lign$=lign$+" ": b=b+1 ' "," remplacée par espace
            end if
            lign$=lign$+mid$(t$(a),b,1)
            tableau$(a,b)= word$(lign$,b) 'tableau des données
          next b
        next a
        '----------------
        for x=1 to n
           lign$=""
          for xx=1 to len(t$(x))
             lign$=lign$+tableau$(x,xx);"////"
          next xx
          #w.te, lign$
          #w.te, " "
       next x
  wait
  [closeHelp]
    name "fg_log_ASK21.txt" as "fg_log_ASK21.csv"
    CLOSE  #w
    END
 

Et avec ça il me mets les "///" à l'affichage alors que la procédure est exactement la même
Code VB :
 
  NOMAINWIN
    WindowWidth = 900: WindowHeight = 400
    UpperLeftX = 10: UpperLeftY = 20
    TEXTEDITOR #w.te, 10, 20, 800, 330
    GRAPHICBOX #w.m 5, 5, 885, 360
    OPEN "Help" FOR window_nf AS #w
    #w, "TRAPCLOSE [closeHelp]"
    #w.m  "down;fill darkred"
    #w.te, "!font courrier 12 bold"
        dim t$(1000): dim tableau$(1000,100)
        '---for pass open file
        t$(1)="3.13333,5969.090577,,,-25.89066315,37.02753448,-0,0,48.29867559,4.020384384"
        t$(2)="4.025,5932.299953,,,-39.78246307,45.03910828,-0.4329966009,0,48.29888526,4.020343566"
        t$(3)="5.01667,5894.483324,,,-32.80235291,51.56939697,-0.4535965919,0,48.29910611,4.020296393"
        t$(4)="6.00833,5865.949696,,,-25.56517982,55.44202042,-0.2370983064,0,48.29936735,4.020234799"
        for a=1 to 4
           lign$="":bb=0
           for b=1 to len(t$(a))
           '  if mid$(t$(a),b,1)="" then exit for
             if mid$(t$(a),b,1)="," or mid$(t$(a),b,1)=" " then
               lign$=lign$+" ": b=b+1
             end if
             lign$=lign$+mid$(t$(a),b,1)
             tableau$(a,bb)= word$(lign$,bb)
           next b
           for t=1 TO len(lign$)
             tableau$(a,t)= word$(lign$,t)
           next t
        next a
'-------------
        for x=1 to 4
           lign$=""
          for xx=1 to len(t$(x))
             lign$=lign$+tableau$(x,xx)+"///"
          next xx
           #w.te, lign$
           #w.te, " "
        next x
'-----
       ' for x=1 to 4
       '   for xx=1 to len(t$(x))
        '   #w.te, tableau$(x,xx);"   ";
          ' #w.te, " "
        '  next xx
       ' next x
  wait
  [closeHelp]
    CLOSE  #w
    END
  NOMAINWIN
    WindowWidth = 900: WindowHeight = 400
    UpperLeftX = 10: UpperLeftY = 20
    TEXTEDITOR #w.te, 10, 20, 800, 330
    GRAPHICBOX #w.m 5, 5, 885, 360
    OPEN "Help" FOR window_nf AS #w
    #w, "TRAPCLOSE [closeHelp]"
    #w.m  "down;fill darkred"
    #w.te, "!font courrier 12 bold"
        dim t$(1000): dim tableau$(1000,100)
        '---for pass open file
        t$(1)="3.13333,5969.090577,,,-25.89066315,37.02753448,-0,0,48.29867559,4.020384384"
        t$(2)="4.025,5932.299953,,,-39.78246307,45.03910828,-0.4329966009,0,48.29888526,4.020343566"
        t$(3)="5.01667,5894.483324,,,-32.80235291,51.56939697,-0.4535965919,0,48.29910611,4.020296393"
        t$(4)="6.00833,5865.949696,,,-25.56517982,55.44202042,-0.2370983064,0,48.29936735,4.020234799"
        for a=1 to 4
           lign$="":bb=0
           for b=1 to len(t$(a))
           '  if mid$(t$(a),b,1)="" then exit for
             if mid$(t$(a),b,1)="," or mid$(t$(a),b,1)=" " then
               lign$=lign$+" ": b=b+1
             end if
             lign$=lign$+mid$(t$(a),b,1)
             tableau$(a,bb)= word$(lign$,bb)
           next b
           for t=1 TO len(lign$)
             tableau$(a,t)= word$(lign$,t)
           next t
        next a
'-------------
        for x=1 to 4
           lign$=""
          for xx=1 to len(t$(x))
             lign$=lign$+tableau$(x,xx)+"///"
          next xx
           #w.te, lign$
           #w.te, " "
        next x
'-----
       ' for x=1 to 4
       '   for xx=1 to len(t$(x))
        '   #w.te, tableau$(x,xx);"   ";
          ' #w.te, " "
        '  next xx
       ' next x
  wait
  [closeHelp]
    CLOSE  #w
    END
 
____________________
Roro

   
Le 21/03/2020 à 14h54

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 601
Désolé, j'étais appelé sur une autre ligne ;)

Je continue sur le dessin des courbes, puisque le chargement du fichier me convient tel qu'il est. Ce qui ne t'empêche pas de chercher et publier ta version, le forum c'est même fait pour ça.

Je testerai dans la soirée.

A+
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 23/03/2020 à 16h12

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2199
Un tableau de lignes géré avec "word$" paraît plus simple qu'un tableau à deux dimensions; moi, je ferais comme ça (en traitant la première ligne à part, à cause des espaces)
Code VB :
 
      NOMAINWIN
    WindowWidth = 900: WindowHeight = 400
    UpperLeftX = 10: UpperLeftY = 20
    STATICTEXT #w.stabs, "Abscisse", 40, 20, 100, 20
    LISTBOX #w.abs, abs$(), [abs], 20, 50,130, 140
    STATICTEXT #w.stc1, "Courbe 1", 180, 20, 100, 20
    LISTBOX #w.c1, c1$(), [c1], 170, 50, 120, 140
    STATICTEXT #w.stc2, "Courbe 2", 320, 20, 100, 20
    LISTBOX #w.c2, c2$(), [c2], 310, 50, 120, 140
    TEXTEDITOR #w.te, 20, 200, 300, 100
    GRAPHICBOX #w.m 450, 50, 400, 230
    OPEN "Help" FOR window_nf AS #w
    #w, "TRAPCLOSE [closeHelp]"
    #w.m  "down;fill white"
    #w.abs, "singleclickselect": #w.c1, "singleclickselect": #w.c2, "singleclickselect"
    name "fg_log_ASK21.csv" as "fg_log_ASK21.txt"
      dim t$(1000): dim tligne$(1000): dim tabu$(1000,1000)
    open "fg_log_ASK21.txt" for input as #g
        while eof(#g)=0
           line input #g, donn$
        wend
        close #g
        lign$=""
        for x=1 to len(donn$)
           lign$=lign$+mid$(donn$,x,1)
           if mid$(donn$,x,1)=chr$(10) then
              n=n+1: tligne$(n)=lign$
              lign$=""
           end if
        next x
          t=0 '   '--------------
          for a=1 to n
            lign$=""
            for b=1 to len(tligne$(a))
            if mid$(tligne$(a),b,1)="," then
              lign$=lign$+"   ": b=b+1
            end if
            lign$=lign$+mid$(tligne$(a),b,1)
          next b
            t=t+1
            t$(t)= lign$ ' tableau des données
        next a
        for x=1 to 10 'rempliss tableaux list
          abs$(x)=word$(t$(1),x): c1$(x)=word$(t$(1),x):  c2$(x)=word$(t$(1),x)
        next x
        #w.abs, "reload": #w.c1 "reload": #w.c2 "reload"
  wait
  [abs]
    #w.abs, "selection? selectedabs$"
    #w.te, "Choix abcisse:  ";selectedabs$
  wait
  [c1]
    #w.c1, "selection? selectedc1$"
    #w.te, "Courbe 1:  ";selectedc1$; "  F de: ";selectedabs$
  wait
  [c2]
    #w.c2, "selection? selectedc2$"
    #w.te, "Courbe 2:  ";selectedc2$; "  F de: ";selectedabs$
  wait
  wait
  [closeHelp]
    name "fg_log_ASK21.txt" as "fg_log_ASK21.csv"
    CLOSE  #w
    END
 
 
____________________
Roro

   
Le 24/03/2020 à 11h50

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 601
Salut Roland,

Je viens de constater, avec ton dernier code, que la listbox est plus commode à l'usage que la combobox.

En effet, il suffit juste de cliquer sur la donnée plutôt que d'abord dérouler la liste avant de choisir. La combobox reste utile pour les cas où la liste est trop longue pour tenir en entier dans la partie visible de la listbox, ou quand il faut réfléchir une demi-seconde, le temps de faire la sélection, avant de choisir une donnée. Comme il y aura rarement 3000 colonnes dans mes sorties FlightGear, j'adopte la listbox et je modifie le programme...

Je reste un peu sceptique sur les vertus du name as : le fichier est renommé, mais tu te bases toujours sur le chr$(10) pour détecter la fin de ligne, et ton LINE INPUT considère toujours que le fichier entier n'est qu'une seule et immense ligne.

Ensuite, rien n'empêche de travailler sur cette ligne pour en extraire les vraies lignes puis de les décortiquer avec WORD$(), mais pour ma part, je préfère déterminer le nombre de données et de lignes par une lecture "à blanc" du fichier, puis dimensionner les tableaux en conséquence, et ensuite lancer le vrai chargement dans les tableaux.

Citation:
J'ai testé la capacité tableau, ça a l'air de coincer au dessus de 100 000

Je suppose que c'est inhérent aux capacités de la machine exécutant le programme, car je ne me souviens pas avoir lu une quelconque limitation du nombre de cases de tableau ou de caractères dans une chaine. On devrait donc se préoccuper, quand on code, de prévoir ce dépassement dont on n'a aucune idée de quand il arrivera, ni de comment on le détectera à temps pour éviter un plantage.

20/03/2020 à 14h22, 1er listing:
Je comprends pas pourquoi il ne veut pas me mettre les "///" entre chaque donnée à l'affichage

Parce que tu crois travailler sur ledsonnées$ qui aurait été rempli au deuxième open "fg_log_ASK21.txt", alors qu'en fait il s'agit du lesdonnées$ rencontré au premier open "fg_log_ASK21.txt".

Comme dans ce second "open" on a déjà un line input #h, entete$ qui considère que le fichier entier tient en une seule ligne, la fin de fichier est atteinte, et ton while/wend charger de mettre à jour lesdonnées$ ne s'exécute pas.

En effet collatéral, je viens d'apprendre que je peux mettre des caractères accentués dans les noms de variable, je me l'étais toujours interdit.

a+



Edité par Christophe Le 24/03/2020 à 11h52
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 24/03/2020 à 15h17

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2199
Citation:
La combobox reste utile pour les cas où la liste est trop longue pour tenir en entier dans la partie visible de la listbox

Même pas car quand la liste dépasse l'ascenseur se met en place
Citation:
dépassement dont on n'a aucune idée de quand il arrivera

Bah il suffit de tester
____________________
Roro

   
Le 24/03/2020 à 20h29

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 601
Deux petites objections, Votre Honneur !

1. l'essentiel est d'utiliser le composant adapté à la situation, et tu es bien content d'avoir une combobox quand tu n'a que deux centimètres disponibles en hauteur,

2. pour tester le programme il faut avoir la machine sur laquelle le programme tournera, il pourrait y avoir un souci potentiel pour quelqu'un à l'autre bout du monde, qui utilise un programme qui pourtant fonctionne bien sur ta machine. Après, je suppose que le staff LibertyBasic a mis des garde-fous...



Edité par Christophe Le 24/03/2020 à 20h29
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 25/03/2020 à 11h49

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2199
Citation:
tu es bien content d'avoir une combobox quand tu n'a que deux centimètres disponibles en hauteur,

Effectivement.
Mis à part ça, je trouve qu'il y a beaucoup de décimales (trop de décimales peut nuire gravement à la santé) ^^
____________________
Roro

   
Général » Lecture de fichiers UTF-8 à la recherche des fins de ligne  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie