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
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.
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.
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 insertsqlite> .output detections.sqlsqlite> 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.sqlsqlite> .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
$ 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.
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>
# Brutal, mais...
Posté par Tonton Th (Mastodon) . Évalué à 5.
Un creuset et un chalumeau…
Non, sérieux, il manque des détails dans ta question.
[^] # Re: Brutal, mais...
Posté par Gil Cot ✔ (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 Marc Quinton . É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 arnauld . É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 arnauld . É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 arnauld . Évalué à 1.
de plus, dans ces fichiers .db il y aura surement des dates similaires, des doublons, etc.
arnauld
[^] # Re: Une .db
Posté par Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 3. Dernière modification le 26 octobre 2022 à 09:53.
Voici le résultat préliminaire
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 Tonton Th (Mastodon) . Évalué à 3.
Hop, n'ayant pas grand chose à faire ce matin, je me lance
avec fermeté dans l'examen de ton cas.
On sait avec quoi a été faite cette base de données. Voyons maintenant son organisation internet et son contenu :
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 Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 3.
Je confirme, il n'y a qu'une seule table et elle n'a pas de clef primaire
Comme j'écrivais ailleurs, faudra les exporter tous pour réimporter dans une base finale.
Il faut traiter la première du lot ainsi :
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 :
Le mode
insert
va écrire les résultats sous formeinsert into detections
au lieu de l'habituel tableau des données. Cette astuce permet de ne pas dupliquer la partiecreate table detections
Enfin, il faudra ouvrir le fichier
detections.sql
dans un éditeur pour déplacer la lignecommit;
quelque part (cela provient du premier.dump
) vers la fin (c'est requis vu qu'on a le seconde ligne qui est unbegin 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
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 benja . Évalué à 1. Dernière modification le 27 octobre 2022 à 13:09.
Sans passer par des dumps: https://www.sqlite.org/lang_attach.html .
Exemple:
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 benja . Évalué à 2.
Et on peut encore simplifier, sans devoir créer la table à priori:
[^] # Re: Une .db
Posté par benja . É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 Gil Cot ✔ (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 arnauld . Évalué à 2.
… j'attends ce week-end et son temps, libre, pour me lancer dans cette aventure fusionnelle.
arnauld
# tout à fait
Posté par steph1978 . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.