• # Brutal, mais...

    Posté par  (Mastodon) . Évalué à 5.

    Un creuset et un chalumeau…

    Non, sérieux, il manque des détails dans ta question.

    • [^] # Re: Brutal, mais...

      Posté par  (site web personnel, Mastodon) . Évalué à 4.

      Exact, au moins faire un file *.db pour indiquer ce que dit la magie…
      À priori, ce sont des bases de données ; mais quel format/appli ?

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

      • [^] # Re: Brutal, mais...

        Posté par  . Évalué à 3.

        peut-etre un fichier au format Gnu-dbm ?
        ```
        $ file /var/cache/man/index.db
        /var/cache/man/index.db: GNU dbm 1.x or ndbm database, little endian, 64-bit

    • [^] # C'est vrai, ça manque de détails.

      Posté par  . Évalué à 1.

      Cela manque de détails. En fait il s'agit de la base de données d'un logiciel, Birdnet-Pi https://birdnetpi.com/ , qui enregistre de courts extraits audio et reconnaît les oiseaux., que j'ai installé sur un Raspberry-Pi chez moi. Base de données où sont enregistrées les détections des oiseaux chez moi, espèces, etc.

      Suite à de mauvaises manipulations de ma part je me retrouve avec plusieurs fichiers .db sur 6 mois de détections, fichiers que j'aimerais fusionner pour ne pas perdre l'historique des détections.

      Comme je n'y connais rien je ne sais pas comment fusionner ces fichiers… Je peux éventuellement en mettre en ligne à disposition.

      Merci.

      arnauld

      • [^] # Une .db

        Posté par  . Évalué à 1.

        j'ai uploadé un fichier .db pour que vous puissiez vous faire une idée : Re: https://arnauld.org/jirafeau/f.php?h=22EsVTiq

        Merci

        arnauld

        • [^] # Re: Une .db

          Posté par  . Évalué à 1.

          de plus, dans ces fichiers .db il y aura surement des dates similaires, des doublons, etc.

          arnauld

        • [^] # Re: Une .db

          Posté par  (site web personnel, Mastodon) . Évalué à 3. Dernière modification le 26 octobre 2022 à 09:53.

          Voici le résultat préliminaire

          $ file ~/Downloads/16sept2022birds.db 
          /home/gilcot/Downloads/16sept2022birds.db: SQLite 3.x database, last written using SQLite version 3034001, file counter 6065, database pages 238, cookie 0x1, schema 4, UTF-8, version-valid-for 6065

          Donc il faut avoir un client SQlite 3 installé pour pouvoir manipuler ces fichiers.
          Dans l'approche, il faudra les exporter puis importer la fusion.

          “It is seldom that liberty of any kind is lost all at once.” ― David Hume

        • [^] # Re: Une .db

          Posté par  (Mastodon) . Évalué à 3.

          Hop, n'ayant pas grand chose à faire ce matin, je me lance
          avec fermeté dans l'examen de ton cas.

          tth@redlady:~/$ file 16sept2022birds.db 
          16sept2022birds.db: SQLite 3.x database, last written using SQLite version 3034001
          

          On sait avec quoi a été faite cette base de données. Voyons maintenant son organisation internet et son contenu :

          tth@redlady:~/$ sqlite3 16sept2022birds.db 
          SQLite version 3.27.2 2019-02-25 16:06:06
          Enter ".help" for usage hints.
          sqlite> .schema
          CREATE TABLE detections (
            Date DATE,
            Time TIME,
            Sci_Name VARCHAR(100) NOT NULL,
            Com_Name VARCHAR(100) NOT NULL,
            Confidence FLOAT,
            Lat FLOAT,
            Lon FLOAT,
            Cutoff FLOAT,
            Week INT,
            Sens FLOAT,
            Overlap FLOAT,
            File_Name VARCHAR(100) NOT NULL);
          sqlite> 
          

          Pas de clef primaire, on va donc essayer d'y aller avec un creuset et un chalumeau. Je ne connais pas beaucoup sqlite, et mes connaissances en SQL sont bien rouillées.

          • [^] # Re: Une .db

            Posté par  (site web personnel, Mastodon) . Évalué à 3.

            Je confirme, il n'y a qu'une seule table et elle n'a pas de clef primaire

            $ sqlite3 ~/Downloads/16sept2022birds.db 
            SQLite version 3.37.0 2021-12-09 01:34:53
            Enter ".help" for usage hints.
            sqlite> .tables
            detections
            sqlite> .header on
            sqlite> .mode column
            sqlite> pragma table_info('detections');
            cid  name        type          notnull  dflt_value  pk
            ---  ----------  ------------  -------  ----------  --
            0    Date        DATE          0                    0 
            1    Time        TIME          0                    0 
            2    Sci_Name    VARCHAR(100)  1                    0 
            3    Com_Name    VARCHAR(100)  1                    0 
            4    Confidence  FLOAT         0                    0 
            5    Lat         FLOAT         0                    0 
            6    Lon         FLOAT         0                    0 
            7    Cutoff      FLOAT         0                    0 
            8    Week        INT           0                    0 
            9    Sens        FLOAT         0                    0 
            10   Overlap     FLOAT         0                    0 
            11   File_Name   VARCHAR(100)  1                    0 
            sqlite> 

            Comme j'écrivais ailleurs, faudra les exporter tous pour réimporter dans une base finale.

            Il faut traiter la première du lot ainsi :

            sqlite> .output detections.sql
            sqlite> .dump detections
            sqlite> .quit

            Attention que le chemin peut être relatif ou absolu mais que chez moi ça ne connait pas des subtilités comme ~/Downloads/detections.sql
            Ensuite donc, pour les autres du lot :

            sqlite> .mode insert
            sqlite> .output detections.sql
            sqlite> select * from detections;
            sqlite> .exit

            Le mode insert va écrire les résultats sous forme insert into detections au lieu de l'habituel tableau des données. Cette astuce permet de ne pas dupliquer la partie create table detections

            Enfin, il faudra ouvrir le fichier detections.sql dans un éditeur pour déplacer la ligne commit; quelque part (cela provient du premier .dump) vers la fin (c'est requis vu qu'on a le seconde ligne qui est un begin transaction;) Ce n'est pas obligatoire mais c'est plus propret.
            Maintenant y a plus qu'à importer le fichier dans une nouvelle base toute propre

            sqlite> drop table if exists detections;
            sqlite> import detections.sql
            sqlite> .quit

            Si on n'est pas à l'aise avec la ligne de commande, il faut regarder du côté de SQLite Studio ou similaires.

            “It is seldom that liberty of any kind is lost all at once.” ― David Hume

            • [^] # Re: Une .db

              Posté par  . Évalué à 1. Dernière modification le 27 octobre 2022 à 13:09.

              Sans passer par des dumps: https://www.sqlite.org/lang_attach.html .

              Exemple:

              $ sqlite
              sqlite> .open 1.db
              sqlite> create table detections (id int);
              sqlite> insert into detections values (1), (11);
              sqlite> .open 2.db
              sqlite> create table detections (id int);
              sqlite> insert into detections values (2), (22);
              sqlite> .open merged.db
              sqlite> create table detections (id int);
              sqlite> attach database '1.db' as db1;
              sqlite> attach database '2.db' as db2;
              sqlite> INSERT into detections SELECT * from db1.detections
                 ...> UNION ALL select * from db2.detections;
              sqlite> SELECT  * from detections;
              1
              11
              2
              22
              sqlite>
              
              

              Avec les vrais données, la procédure commence au .open merged.db et en utilisant le create table posté dans le commentaire parent. Ajouter autant de "UNION ALL SELECT .." que nécessaire.

              • [^] # Re: Une .db

                Posté par  . Évalué à 2.

                Et on peut encore simplifier, sans devoir créer la table à priori:

                $ sqlite3
                SQLite version 3.39.4 2022-09-29 15:55:41
                Enter ".help" for usage hints.
                Connected to a transient in-memory database.
                Use ".open FILENAME" to reopen on a persistent database.
                sqlite> .open merged2.db
                sqlite> attach database '1.db' as db1; attach database '2.db' as db2;
                sqlite> create table detections as SELECT * from db1.detections
                   ...> UNION ALL select * from db2.detections;
                sqlite> SELECT  * from detections;
                1
                11
                2
                22
                sqlite>
                
                • [^] # Re: Une .db

                  Posté par  . Évalué à 1.

                  Dans la vrai vie, ne pas oublier de recréer les indexes et les autres tables (dès fois que quelqu'un tombe sur cette page dans un autre contexte).

                • [^] # Re: Une .db

                  Posté par  (site web personnel, Mastodon) . Évalué à 2.

                  Bien vu, et c'est encore mieux (il fait tout le bon et on minimise les risques de mauvaises manipulations par le passage de fichiers tampons)

                  “It is seldom that liberty of any kind is lost all at once.” ― David Hume

  • # Merci...

    Posté par  . Évalué à 2.

    … j'attends ce week-end et son temps, libre, pour me lancer dans cette aventure fusionnelle.

    arnauld

  • # tout à fait

    Posté par  . Évalué à 2.

    { sqlite3 a.db '.dump' ; sqlite3 b.db '.dump' ; } | sqlite3 c.db

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.