IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Problème de conversion dû à l'encodage [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut Problème de conversion dû à l'encodage
    Bonjour,
    Je suis un petit utilisateur de Lazarus sous Linux depuis un certain temps et j'utilise Lazarus surtout pour la gestion de données avec sqlite3.
    J'ai développé plusieurs petites applications de gestion financière dans lesquelles j'importe des fichiers de relevés bancaires au format CVS, XLS jusqu'ici sans problème.
    Voiàa suite à un relevé d'une nouvelle banque les fichiers au format CSV ou XLS me donnent des données étranges quand je lis les fichiers de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Openchoix.InitialDir:=MCHEMIN+'releveCE'+MSEPARATEUR;
    MEXTENSION:=Copy(OpenChoix.FileName,Length(OpenChoix.FileName)-2,3);
      if  (OpenChoix.FileName<>'') and (MEXTENSION='csv') then
      begin
      AssignFile(FICHIER, OpenChoix.FileName);{ Fichier dans la boite}
      MFICHIER:=OpenChoix.FileName;
      Reset(FICHIER); // on se positionne sur le premier enregistrement du fichier
      TAMPON:='';
      XTAB:=1;
        while not eof(FICHIER) do  // on charge un tableau avec chaque ligne lue
        begin
        Readln(FICHIER,XTAMPON);
        TAB[XTAB]:=XTAMPON;
        Inc(XTAB);
        end;
      CloseFile(FICHIER);
      DebutTraitement;
      end
      else
      begin
      MessageDLG ('Erreur, pas de fichier sélectionné', mtError, [mbCancel],0);
      end;
    Je pense qu'il y a un problème de codage mais voilà je ne sais pas comment résoudre mon problème, je pense qu'il faudrait trouver le codage du fichier téléchargé et le convertir avant de le lire avec les composants de l'unité LazUtl8 mais les explications sont en anglais et le projet exemple donné ne veut pas se compiler chez moi.
    Alors une petite prise en main me serait utile.
    Merci d'avance

  2. #2
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    J'ai trouvé une solution pour résoudre mon problème c'est l'utilisation de la commande file -i pour connaître l'encodage et ensuite la commande iconv pour convertir mon fichier mais comment ajouter ces commandes dans mon programme lazarus, et donc rendre transparent le traitement.
    C'est peut-être possible mais je ne connais pas encore cette modification.
    A+

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Est-ce que vous pourriez fournir un échantillon de fichier qui pose problème, et aussi les lignes de commande que vous avez utilisées pour résoudre le problème ? De façon qu'on puisse vous faire une réponse vraiment utile.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    Bonsoir,
    Merci de me répondre. Mon problème est résolu en traitant le fichier téléchargé de la manière suivante avec des commandes de linux :
    La première file -i nom du fichier pour connaître son codage et ensuite la commande iconv qui permet d'indiquer le codage existant et le codage souhaité.
    Ensuite mon application est capable de lire et utiliser les données du fichier reçu.
    Maintenant je cherche à intégrer ces fonctions dans mon application et j'en suis à l'utilisation de Tprocess pour de réaliser les mêmes opérations mais pour l'instant ce n'est pas une réussite même en utilisant les exemples du wiki de lazarus.
    En cherchant à utiliser ces exemples j'ai une erreur étrange qui m'informe que l'option de la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AProcess:=TProcess.Create(nil);
      AStringList:=TStringList.Create;
      AProcess.CommandLine:='file -i /donnees/laz_linux/bnp/releves_BNP/E3423137.csv';
      AProcess.Options:=AProcess.Options+[poWaitOnExit,poUsePipes];
    AProcess.CommandLine: ne serait pas correcte ou plus d'actualité avec pour message warning : symbol "commandeline" is deprecated.
    Bien étrange j'ai pourtant la dernière version validée de lazarus la 1.8.4.
    Selon l'utilisation d'un exemple j'ai trouvé que le fichier à problème est codé iso-8859-1.
    Donc il me reste à trouvé réaliser la même chose que via le terminal à moins de réussir à utiliser les fonctions WinCPToUtf8 ou son inverse mais pour l'instant je en sais pas les utilier d'où mon orientation vers l'utilisation de Tprocess.
    A+

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Je pense que le plus simple serait d'utiliser les fonctions internes de Lazarus, plutôt que les commandes file et iconv.

    Voici un exemple qui fonctionne chez moi (sous Windows). La fonction GuessEncoding() permet de faire une conjecture sur l'encodage du fichier. Chez moi, avec le fichier que j'ai utilisé, la fonction renvoie "cp1252". La fonction ConvertEncoding() convertit le fichier en UTF8.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    uses
      LConvEncoding;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      liste: TStringList;
      texteOriginal: string;
      texteUTF8: string;
    begin
      liste := TStringList.Create;
      try
        liste.LoadFromFile('mon_fichier.csv');
        texteOriginal := liste.Text;
        ShowMessage(texteOriginal);
        ShowMessage(GuessEncoding(texteOriginal));
        texteUTF8 := ConvertEncoding(texteOriginal, GuessEncoding(texteOriginal), EncodingUTF8);
        ShowMessage(texteUTF8);
      finally
        liste.Free;
      end;
    end;
    À vous de faire des essais pour voir quels résultats renvoie la fonction GuessEncoding() avec vos fichiers.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    Eh il y en a qui se lève tôt !
    Merci pour la proposition que je vais tester et j'en donnerais le résultat.
    A+

  7. #7
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    Bonsoir,
    J'ai testé la proposition et j'ai le résultat attendu.
    Merci encore.
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de conversion d'encodage
    Par Morgan7469 dans le forum C#
    Réponses: 2
    Dernier message: 31/01/2011, 11h27
  2. - [CAST ou CONVERT] Problème de conversion de date
    Par Boublou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/07/2004, 14h31
  3. Problème de conversion 3DS->.X
    Par JBernn dans le forum DirectX
    Réponses: 5
    Dernier message: 08/04/2004, 19h08
  4. Problème de conversion unicode
    Par djmalo dans le forum C
    Réponses: 5
    Dernier message: 09/03/2004, 11h48
  5. Réponses: 11
    Dernier message: 02/09/2003, 14h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo