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

  1. #1
    Membre éprouvé
    Rechercher un titre dans un fichier texte à partir d'un indice sous D6 et Windows 10.
    Bonjour à toutes et à tous,

    Depuis un fichier texte dont le nom change tout le temps sauf l'indice qui est toujours ("title" j'aimerai récupérer dans un Tedit avec cet exemple "Jose Feliciano che sara" sans les guillemets

    Exemple :


    "season_number": null, "title": "Jose Feliciano che sara",
    J'utilise une variable TStringList qui me charge mon fichier dans un TMemo mais je ne vois pas comment récupérer ce titre.

    Merci si quelqu'un avait une piste.

    @+,

    cincap

  2. #2
    Modérateur

    Bonjour,
    Si tu as toujours la même structure dans une chaîne en entrée, tu peux tenter un code de ce style (non testé) :
    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
    function ExtraitTitre(aFrom: string): string;
    const
      Motif = '"title": "';
      Long = Length(Motif);
    var
      S: string;
      i, Len: integer;
    begin
      Result := '';
      Len := Length(aFrom);
      i := Pos(Motif, aFrom);
      if i = 0 then
        Exit
      else
        S := Copy(aFrom, i+Long+1, Len-i-Long+1;
      i := Pos('"', S);
      if i = 0 then
        Exit
      else
        SetLength(S, i-1);
      Result := S;
    end;
    Delphi 5 Pro - Delphi 10.3.2 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre confirmé
    Salut

    Ou une solution similaire..

    La borne est ce que tu appelles : Indice ( passé en paramètre).

    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
    23
    24
    25
    26
    27
    Function ExtraitTitre(borne:string):string;
    var Stl :TstringList;
        Line:string;
        i,p :integer;
    begin
         Stl:=TstringList.create;
         Stl.LoadFromFile('C:\Users\Public\Documents\Embarcadero\title.txt');
     
         for i:=0 to Stl.Count-1 do
         begin
             line:=Stl[i];
             P:=AnsiPos(Borne,line);
             if P<>0 then
             begin
                 delete(line,1,P+length(Borne)-1);
                 delete(line,length(line)-1,length(line));
                 result:=line;
                 exit;
             end;
         end;
    end;
     
     
    procedure TForm7.Button1Click(Sender: TObject);
    begin
       edit2.Text:=ExtraitTitre('"Title":"');
    end;


    a bientôt
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  4. #4
    Rédacteur/Modérateur

    Bonjour,

    Cela ressemble quand même furieusement à un ensemble de couple nom=valeur qu'une TStringList sait gérer.
    Maintenant, avec D6 , frustrant je ne peux tester
    peut-on changer le signe (NameValueSeparator) '=' par ':' sous D7 il semblerait que oui
    une fois la liste chargée il suffirait alors d'utiliser titre:=stringlist.value['title']

    je pense à quelque chose comme ça
    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
     
     ligne:='"season":null,"title":"Julio noucera que sera"';
     
    function gettitre(ligne : string) : String;
     var Sl : TStringList;
        texte : String;
        i : integer;
    begin
    Sl:=TStringList.Create;
    try
    // sl.QuoteChar:='"';
     sl.StrictDelimiter:=true;
     sl.NameValueSeparator:=':';
     sl.DelimitedText:=StringReplace(ligne,'"','',[rfReplaceAll]);
     result:=sl.Values['title'];
    finally
      SL.Free;
    end;
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  5. ###raw>post.musername###
    Membre éprouvé
    Bonjour à toutes et à tous,

    @ petitcoucou31, merci de ta suggestion, j'ai testé et pas d'erreur mais cela ne fonctionne pas.

    @ tourlourou, merci aussi de ta suggestion, à part un oubli de la parenthèse de fermeture, cela ne fonctionne pas non plus.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     else
        S := Copy(aFrom, i+Long+1, Len-i-Long+1);


    @ SergioMaster, merci de ta suggestion, je pense que c'est une approche, mais comment tester ?

    A toutes fins, un exemple du contenu de ce fichier et c'est bien après l'indice "title": que j'aimerai récupérer le titre.

    [QUOTE]
    {"artist": "Alain Morisod & Sweet People", "filesize": null, "extractor": "youtube", "vcodec": "none", "height": null, "_filename": "Audio\\Halleluia.webm", "duration": 235, "average_rating": 4.8823528, "dislike_count": 1, "is_live": null, "webpage_url_basename": "watch", "format_note": "DASH audio", "channel_url": "http://www.youtube.com/channel/UCuix9xiVI87oi4WtZTSkUCg", "track": "Alleluia", "thumbnail": "https://i.ytimg.com/vi/VaDjAsQG6Ao/maxresdefault.jpg", "language": null, "tbr": 140.55, "title": "Alain Morisod & Sweet People = Alleluia", "abr": 160, "series": null, "release_year": null, "view_count": 2956, "fps": null, "album": "Super Sympa", "uploader_id": "UCuix9xiVI87oi4WtZTSkUCg", "container": "webm_dash", "protocol": "http_dash_segments", "season_number": null, "annotations": null, "age_limit": 0, "format": "251 - audio only (DASH audio)", "fragments": [{"path": "range/0-258"}, {"duration": 10.001, "path": "range/664-174453"}, {"duration": 10.0, "path": [/QUOTE]

    Je continue aussi de chercher.

    @+,

    cincap
      0  0

  6. ###raw>post.musername###
    Modérateur
    Bonjour,
    A peine remis en forme :
    [CODE]procedure TForm1.Button6Click(Sender: TObject);
    const
    Chaine1 = '{"artist": "Alain Morisod & Sweet People", "filesize": null, "extractor": "youtube", "vcodec": "none", "height": null, "_filename": "Audio\\Halleluia.webm", "duration": 235, "average_rating": 4.8823528, ';
    Chaine2 = '"dislike_count": 1, "is_live": null, "webpage_url_basename": "watch", "format_note": "DASH audio", "channel_url": "http://www.youtube.com/channel/UCuix9xiVI87oi4WtZTSkUCg", "track": "Alleluia", ';
    Chaine3 = '"thumbnail": "https://i.ytimg.com/vi/VaDjAsQG6Ao/maxresdefault.jpg", "language": null, "tbr": 140.55, "title": "Alain Morisod & Sweet People = Alleluia", "abr": 160, "series": null, "release_year": null, ';
    Chaine4 = '"view_count": 2956, "fps": null, "album": "Super Sympa", "uploader_id": "UCuix9xiVI87oi4WtZTSkUCg", "container": "webm_dash", "protocol": "http_dash_segments", "season_number": null, "annotations": null, ';
    Chaine5 = '"age_limit": 0, "format": "251 - audio only (DASH audio)", "fragments": [{"path": "range/0-258"}, {"duration": 10.001, "path": "range/664-174453"}, {"duration": 10.0, "path": '; Motif = '"title": "'; function ExtraitTitre(aPattern, aFrom: string): string; var S: string; i, Len, LongP: integer; begin Result := ''; Len := Length(aFrom); LongP := Length(aPattern); i := Pos(Motif, aFrom); if i = 0 then Exit else S := Copy(aFrom, i+LongP+1, Len-i-LongP+1); i := Pos('"', S); if i = 0 then Exit else SetLength(S, i-1); Result := S; end; var TestString: string; begin TestString := Chaine1 + Chaine2 + Chaine3 + Chaine4 + Chaine5; ShowMessage(ExtraitTitre(Motif, TestString)); end;[/CODE]
    affiche :
    [Window Title]
    Project1

    [Content]
    lain Morisod & Sweet People = Alleluia

    [OK]
    J'avais cru comprendre que c'était la valeur cherchée ?
      0  0

  7. #7
    Rédacteur/Modérateur

    Re,

    cet extrait ressemble furieusement à du JSON, ce que bien évidemment D6 ne connaissais pas
    Pour avoir lu son article en correction technique, je sais que popo propose quelque chose qui pourrait fonctionner, mais comme ce n'est pas encore publié, le contacter par MP.

    Il y a très certainement aussi des composants tiers, je n'ai pas cherché énormément pour trouver des possibilités soit sur github soit sur sourceforge de là à dire que ce sera d6 compatible ....

    Autre possibilité, les expressions régulières mais idem problème de compatibilité D6.

    Donner le fichier texte complet dès le début aurait quand même été mieux pour fournir la bonne piste : c'est du JSON.
    Même ce dernier extrait, malgré ma connaissance partielle de JSON, ne me semble pas complet
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  8. #8
    Membre confirmé
    bonjour

    Mon code marche sous Delphi Rio,

    Par contre dans mon appel à la fonction.. j'ai mis une majuscule a "Title ..., qui n'existe pas dans ton fichier texte. D’où le non fonctionnement.
    A corriger !

    A plus
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  9. #9
    Membre éprouvé
    @ petitcoucou31,


    Par contre dans mon appel à la fonction.. j'ai mis une majuscule a "Title ..., qui n'existe pas dans ton fichier texte. D’où le non fonctionnement.
    A corriger !
    je viens à nouveau de tester en modifiant la majuscule et rien.

    J'avais juste modifié "Edit2" par le nom de mon Tedit "Ednom" pour afficher le résultat.

    @ SergioMaster, en effet j'ai la possibilité de créer un fichier .json ou un fichier .txt mais alors c'est une autre base pour l'indication du titre :


    [ffmpeg] Adding metadata to 'Audio\Alleluia_Alain_Morisod_Sweet_People.mp3'
    @ tourlourou, encore merci je vais tester.

    Cordialement,

    @+,

    cincap

  10. #10
    Membre éprouvé
    Avec ceci, j'obtiens un résultat qui me convient je continue à tester suivant le résultat dans le fichier "Titre.txt" et suivant le fichier musical.

    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
    23
     
    var
    UnStringList:TStringList;
    begin
     
      //Création du STringList
      UnStringList:=TStringList.Create;
      try
         //Chargement du fichier texte
         UnStringList.LoadFromFile(chappli + 'Titre.txt');
     
         //Contrôle
         Memo1.Lines.LoadFromFile(chappli + 'Titre.txt');
     
         Ednom.Text:=UnStringList.strings[UnStringList.Count -4];
     
      finally
     
         //Destruction du StringList
         UnStringList.Free;
      end;
      //ShowMessage(RightStr(ednom.text,Length(ednom.text)-28));
      Ednom.text := (RightStr(ednom.text,Length(ednom.text)-28));


    @+,

    cincap

  11. #11
    Membre émérite
    Bonjour Cincap,

    ton dernier code n'est pas général. Il suppose que le titre à une longueur de 28 caractères. Utilise plutôt ceux de PetitCoucou31 ou Tourlourou qui fonctionnent très bien.

    Il faut utiliser la fonction Pos pour localiser "title :

    A+
    Charly

  12. #12
    Rédacteur/Modérateur

    Citation Envoyé par cincap Voir le message

    @ SergioMaster, en effet j'ai la possibilité de créer un fichier .json ou un fichier .txt mais alors c'est une autre base pour l'indication du titre :
    On ne se comprend, a priori, pas !
    Je parle du fait que le fichier à analyser semble être en format JSON et tu me réponds que tu peux créer des fichiers JSON le rapport ?

    Je suis d'accord, s'il n'y a qu'à extraire le titre un pos de la chaine "title": permet de se déplacer directement dessus.
    La valeur obtenue+la longueur de la chaine recherchée+1 donne le début du titre de la chanson
    un remplissage d'une chaine caractère par caractère jusqu'à ce qu'un nouvel guillemet soit obtenu (je viens de découvrir que guillemet était masculin) donnera le titre entier, ce que la fonction de toulourou proposait
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  13. #13
    Membre émérite
    Bonjour Cincap,

    voici ton code comportant avec la fonction de Tourlourou que j'ai testé avec succès sous D7 (et Win 10 !!)

    (avec une simple correction d'indice en ligne 19)

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    { ========================================================================== }
    procedure TForm1.Button2Click(Sender: TObject);
    Const
      Motif = '"title": "';
    { -------------------------------------------------------- }
    function ExtraitTitre(aPattern, aFrom: string): string;
    // Extraction de aPattern dans aFrom
     var
      S: string;
      i, Len, LongP: integer;
     begin
      Result := '';
      Len := Length(aFrom);
      LongP := Length(aPattern);
      i := Pos(Motif, aFrom);
      if i = 0 then
        Exit
      else
        S := Copy(aFrom, i+LongP, Len-i-LongP+1);
      i := Pos('"', S);
      if i = 0 then
        Exit
      else
        SetLength(S, i-1);
      Result := S;
     end;
    { -------------------------------------------------------- }
    var
      UnStringList:TStringList;
      i : Integer ;          // ligne courante du fichier Titre.txt
      chappli  : String ;    // Répertoire de l'application
      Index : Integer ;      // Numéro de la ligne comportant Motif
    begin
      chappli  := IncludeTrailingBackslash(ExtractFilePath(Application.ExeName)) ;
      //Création du STringList
      UnStringList:=TStringList.Create;
      try
         //Contrôle
         Memo1.Lines.LoadFromFile(chappli + 'Titre.txt');
         //Chargement du fichier texte
         UnStringList.LoadFromFile(chappli + 'Titre.txt');
         Index := -1 ;
         For i := 0 To Memo1.Lines.Count - 1 Do
         //  au cas ou Titre.txt comporte plusieurs lignes
           Begin
             If Pos(Motif, UnStringList.strings[i]) >0 Then
               Begin
                 Index := i ;
                 Break ;
               End ;
           End ;
         If (Index >=0) Then
           Ednom.Text:= ExtraitTitre(Motif, UnStringList.strings[Index]);
      finally
         //Destruction du StringList
         UnStringList.Free;
      end;
    end;
    { ========================================================================== }


    A+
    Charly

    PS : @SergioMaster : chez moi on dit un nouveau guillemet

  14. #14
    Rédacteur/Modérateur

    Citation Envoyé par Charly910 Voir le message
    @SergioMaster : chez moi on dit un nouveau guillemet
    je n'ai pas appliqué le genre jusqu'au bout
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  15. #15
    Débutant
    salut
    si je comprends bien "title" revient qu'une seule fois ?
    as tu réussi avec ce qui t'a été donné ?

  16. #16
    Membre éprouvé
    Bonjour à toutes et à tous,

    Excusez du retard mais beaucoup de déplacement vers l'hôpital en ce moment .

    Merci aux membres qui ont continué à alimenter ce topic.

    @ Charly910


    ton dernier code n'est pas général. Il suppose que le titre à une longueur de 28 caractères. Utilise plutôt ceux de PetitCoucou31 ou Tourlourou qui fonctionnent très bien.
    Tu as tout à fait raison, je m'en suis rendu compte avec d'autres tests et je vais tester ce que tu me suggères.

    @ SergioMaster,


    Je parle du fait que le fichier à analyser semble être en format JSON et tu me réponds que tu peux créer des fichiers JSON le rapport ?
    Tu as raison, dans mon exemple c'est bien un fichier .Json et c'est pour cela que j'écrivais que j'avais le choix dans ma commande de créer soit un fichier .txt ou un fichier .json en ajoutant ceci "--write-info-json" dans cette commande Dos.

    Merci à tous, je vais tester et vous dit quoi.

    @+,

    cincap

  17. #17
    Membre éprouvé
    @ Charly 910 Voila j'ai testé dans tous les sens et ta solution fonctionne correctement quand il s'agit d'un fichier ayant l'extension .json car avec ce fichier dans le code il y a toujours le repère "title".

    Seul inconvénient avec ce fichier c'est que je ne connais pas son nom à l'avance et donc je ne saurai pas l'indiquer dans ma procédure.

    Par contre le fichier "Titre.txt" c'est moi qui choisis son nom et qui le renseigne dans la commande mais dans le code final le repère "title" ne s'y trouve pas.

    Mais la ligne qui renseigne le titre est "[ffmpeg] Destination: Audio\" Titre

    Exemple :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    aCmdLine := PChar(cmdSwitch + eddos.text + '"'+Edtitre.Text+'"' + '.%(ext)s ' + '"'+edurl.Text+'"'+ '>Titre.txt') ;


    Pour le fichier .json je dois l'indiquer dans la commande du TEdit "eddos.text"

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    -x --extract-audio --audio-format mp3 --write-info-json --output Audio/


    Et dans ce fichier le repère "title" s'y trouve.

    Et la solution de Charly910 est plus que extra.

    Je vais voir la modif avec le fichier "Titre.txt" en utilisant la solution de Charly910.

    @+,

    cincap

  18. #18
    Membre émérite
    Bonjour,

    je n'ai fait que reprendre la fonction de Tourlourou !

    Je suis content que cela fonctionne,, même si je n'ai pas tout compris.

    A+
    Charly

  19. ###raw>post.musername###
    Membre éprouvé
    @ Charly910, tu as raison merci aussi à Tourlourou bien entendu.

    1) je charge un lien d'une vidéo YouTube ("https://www.youtube.com/watch?v=rMxeXTnrRV0").

    2) je récupère le fichier audio avec FFMPEG et YouTube-dl //Ce qui est autorisé quand c'est pour une utilisation personnelle et non commerciale (Loi)

    Si j'utilise la création d'un fichier .json il prend le nom du fichier audio qui est dans la vidéo (que je ne connais pas puisqu'il est crypté) donc je ne sait pas le placer dans le TMemo pour le lire.

    A ce stade la solution de Tourlourou remaniée par Charly910 est super si je la teste avec un fichier .json qui existe déjà.

    3) Si je crée moi même un fichier text dans ma commande d'extraction, je peux lui donner un nom quelconque soit Titre.txt et dans ce fichier lors du déroulement du code il existe toujours
    la chaîne "[ffmpeg] Destination: Audio\"puis le nom de l'audio.mp3 peu importe la ligne ou elle se trouve.

    C'est pour cela que la solution avec le chiffre 28 fonctionne car ce chiffre représente le nombre de caractère avant le contre slash et sera toujours le même indépendamment du nombre de caractères que contient le titre de la vidéo qui est le même pour l'audio.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    procedure TForm1.Button3Click(Sender: TObject);
    var
    Contents:TStringList;
    find:boolean;
    i:integer;
     
    chaine : string;
    begin
      Memo1.Lines.LoadFromFile(chappli + 'Titre.txt');
     
     Chaine := '[ffmpeg] Destination: Audio\' ;
     
      find:=false;
     
      Contents:=TStringList.Create;
      try
        Contents.LoadFromFile(chappli + 'Titre.txt');
        i:=0;
        repeat
     
        If (Pos(Chaine, Contents[i]) > 0) then
           find:=true
     
         else
           i:=i+1;
        until ((find) or (i=Contents.Count));
     
        if find then
     
        ednom.text := (RightStr(Contents[i],Length(Contents[i])-28));
     
      finally
        Contents.free;
         end;
     
    end;


    La procédure du bouton3 est actionnée après le processus de l'extraction.

    Voila voilou,

    @+,

    cincap
      0  0

  20. #20
    Rédacteur/Modérateur

    Bonjour
    Citation Envoyé par cincap Voir le message

    Excusez du retard mais beaucoup de déplacement vers l'hôpital en ce moment .
    Je compatis, ce n'est pas vraiment le moment d'aller faire un tour dans ces établissements sauf cas de force majeur

    @ SergioMaster,
    Tu as raison, dans mon exemple c'est bien un fichier .Json

    Il me manquait juste la compréhension de l'obtention de ce fichier, cette histoire de commande DOS m'échappait du moins dans cette discussion !

    Tu n'as donc pas de composant pour lire des fichiers JSON (ce que des versions modernes ont) dommage. Du coup le format JSON est peut-être moins attractif que le format .text tout bête (moins de balises spécifiques à JSON )
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd