From db52c72d220f3db84db2ab6a40d3de55825a2e83 Mon Sep 17 00:00:00 2001 From: nobohan Date: Tue, 17 Sep 2024 15:37:16 +0200 Subject: [PATCH] Add another method to prepare the import tables --- README.md | 49 +++++++++++++++++--------- sql/prepare-import.sql | 79 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 16 deletions(-) create mode 100644 sql/prepare-import.sql diff --git a/README.md b/README.md index 622ff7f..04c7ed8 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ CHILL - Reprise de données ========================== -Ce dépôt contient un script d'import qui s'applique à un canevas excel présenté au client. Le client remplit le fichier excel, puis le script insère les données dans la base de donnée. +Ce dépôt contient un script d'import qui s'applique à un canevas excel présenté au client. Le client remplit le fichier excel, puis le script insère les données dans la base de donnée. -L'opération est semi-automatique et réduit considérablement le temps dédié à l'import en structurant le format des données en entrée. Par contre il y a toujours une série de manipulations, pour préparer et insérer les données correctement. +L'opération est semi-automatique et réduit considérablement le temps dédié à l'import en structurant le format des données en entrée. Par contre il y a toujours une série de manipulations, pour préparer et insérer les données correctement. Ces manipulations sont décrites ici. - + Le client a rempli le canevas. Une relecture du fichier est toujours nécessaire afin de repérer les éventuelles irrégularités. ## 1. Préparer les fichiers csv @@ -14,18 +14,18 @@ Le client a rempli le canevas. Une relecture du fichier est toujours nécessaire Le fichier se compose de plusieurs feuilles, chacune doit être sauvée au format csv. Pour préparer les fichiers on va: -- nettoyer le fichier pour ne laisser en étiquette que les noms de colonnes en anglais. -- ajouter une colonne de contôle en fin de ligne, par sécurité. Par exemple une colonne 'endcol' qui contient pour chaque cellule 'endrow'. -- ajouter les doublequote lors de la sauvegarde du csv, +- nettoyer le fichier pour ne laisser en étiquette que les noms de colonnes en anglais. Il faut donc supprimer les 4 premières lignes de chaque fichier + la 6ème ligne. +(- ajouter une colonne de contôle en fin de ligne, par sécurité. Par exemple une colonne 'endcol' qui contient pour chaque cellule 'endrow'.) +- ajouter les doublequote lors de la sauvegarde du csv, - enlever tous les line breaks et caractères spéciaux. ```bash # Exemple de remplacements exécutés sur les fichiers csv pour un import spécifique : -$ sed -e :1 -e '$q' -e "/$CR\$/b" -e 'N;s/\n//;b1' < file.2.csv > file.3.csv +$ sed -e :1 -e '$q' -e "/$CR\$/b" -e 'N;s/\n//;b1' < file.2.csv > file.3.csv $ sed -e 's#"end"#"end"\n#g' < file.3.csv > file.4.csv -# Exemple pour un autre import: -$ cat file2.csv | sed -e 'N; s#_x000D_##g; s#\n##g; s/$CR//g' | tr "\n" " " > file3.csv +# Exemple pour un autre import: +$ cat file2.csv | sed -e 'N; s#_x000D_##g; s#\n##g; s/$CR//g' | tr "\n" " " > file3.csv $ sed -e 's#"endcol"#"endcol"\n#g; s#"endrow"#"endrow"\n#g' < file3.csv > file4.csv $ sed -e 's#^,##g; s#^ ##g' < file4.csv > file5.csv ``` @@ -38,14 +38,14 @@ On va insérer chaque feuille csv comme table à part entière d'un nouveau sch - import.choix_periodes - import.periodes -Pour réaliser cet import, on peut utiliser des outils tels que `pgfutter`, mais celui-ci peut s'avérer capricieux selon le fichier. +Pour réaliser cet import, on peut utiliser des outils tels que `pgfutter`, mais celui-ci peut s'avérer capricieux selon le fichier. La meilleure méthode pour moi est de réaliser cette étape en local avec phpstorm, puis d'exporter le schéma `import` avec pg_dump avant de le transférer sur le serveur. ### 2.a Manipulations dans phpstorm - S'il n'existe pas, créer le schéma `import`; s'il existe, s'assurer qu'il ne contient pas de tables ni de données. #### Importer le csv dans la db -- ouvre le fichier csv > passe en onglet text > edit as table > set options: +- ouvre le fichier csv > passe en onglet text > edit as table > set options: - cocher 'first row is header' - 'null value text': undefined (pas de champs null dans la table, mais un texte vide) - then > open table @@ -56,14 +56,31 @@ La meilleure méthode pour moi est de réaliser cette étape en local avec phpst - then > import #### Exporter en sql - créer un fichier `-data.sql` vide -- depuis chaque table du schéma `import`: +- depuis chaque table du schéma `import`: - copier le DDL de la table dans le fichier (s'assurer d'ajouter le préfixe `import.` sur chaque requête) - - export data > extractor: SQL-insert-multirow > copy to clipboard + - export data > extractor: SQL-insert-multirow > copy to clipboard - coller les données dans `-data.sql` +### 2.b Avec des fonctions Postgresql + +On peut aussi utiliser la fonction `\copy` de psql pour charger un fichier csv dans les tables temporaires du schéma "import". + +Tout d'abord, les tables du schéma "import" doivent être préparées avec le script `prepare-import.sql`. + +Puis on importe les 4 fichiers csv. + +```bash +psql chill-import +chill-import=# \copy "import".choix_personnes FROM 'choix_personnes.csv' DELIMITER ',' CSV HEADER +chill-import=# \copy "import".personnes FROM 'personnes.csv' DELIMITER ',' CSV HEADER +chill-import=# \copy "import".choix_periodes FROM 'choix_periodes.csv' DELIMITER ',' CSV HEADER +chill-import=# \copy "import".periodes FROM 'periodes.csv' DELIMITER ',' CSV HEADER +``` + + ## 3. Import du schéma 'import' sur le serveur (safran) -- transférer le fichier `-data.sql` sur le serveur (avec scp): +- transférer le fichier `-data.sql` sur le serveur (avec scp): ```bash $ scp cyclo-data.sql debian@safran:~/data/tmp/ ``` @@ -91,7 +108,7 @@ cycloprod=# \i '/home/debian/data/tmp/cyclo-data.sql' -- vérifier que le schéma import est en place cycloprod=# \dt import.* List of relations - Schema | Name | Type | Owner + Schema | Name | Type | Owner --------+-----------------+-------+---------- import | choix_periodes | table | postgres import | choix_personnes | table | postgres @@ -100,7 +117,7 @@ cycloprod=# \dt import.* (4 rows) ``` -## 4. Exécution du script de migration +## 4. Exécution du script de migration Se fait dans la console postgresql, en tant que user postgres, en étant connecté à la base de donnée cible. diff --git a/sql/prepare-import.sql b/sql/prepare-import.sql new file mode 100644 index 0000000..cdd62de --- /dev/null +++ b/sql/prepare-import.sql @@ -0,0 +1,79 @@ +CREATE TABLE "import".choix_personnes ( + civility varchar(50) NULL, + gender varchar(50) NULL, + maritalstatus varchar(50) NULL, + country varchar(50) NULL, + household_composition_type varchar(50) NULL, + household_position varchar(50) NULL +); + +CREATE TABLE "import".personnes ( + civility varchar(50) NULL, + lastname varchar(50) NULL, + firstname varchar(50) NULL, + gender varchar(50) NULL, + gendercomment varchar(50) NULL, + nationality varchar(50) NULL, + memo varchar(50) NULL, + birthdate varchar(50) NULL, + place_of_birth varchar(50) NULL, + countryofbirth varchar(50) NULL, + deathdate varchar(50) NULL, + email varchar(50) NULL, + phonenumber varchar(50) NULL, + mobilenumber varchar(50) NULL, + contactinfo varchar(50) NULL, + street varchar(50) NULL, + extra varchar(50) NULL, + streetnumber varchar(50) NULL, + postcode varchar(50) NULL, + country varchar(50) NULL, + validfrom varchar(50) NULL, + maritalstatus varchar(50) NULL, + maritalstatuscomment varchar(50) NULL, + numberofchildren integer NULL, + household_composition_type varchar(50) NULL, + household_position varchar(50) NULL, + household_startdate varchar(50) NULL +); + +CREATE TABLE "import".choix_periodes ( + closingmotive varchar(50) NULL, + origin varchar(50) NULL, + acp_scopes varchar(50) NULL, + job varchar(50) NULL, + "user" varchar(50) NULL, + parent varchar(50) NULL, + enfant varchar(50) NULL, + acp_social_issues varchar(50) NULL, + work_social_action varchar(50) NULL, + street varchar(128) NULL, + extra varchar(50) NULL, + streetnumber integer NULL, + postcode integer NULL, + country varchar(50) NULL +); + + +CREATE TABLE "import".periodes ( + nom varchar(50) NULL, + openingdate varchar(50) NULL, + closingdate varchar(50) NULL, + closingmotive varchar(50) NULL, + origin varchar(50) NULL, + remark integer NULL, + intensity varchar(50) NULL, + referrer varchar(50) NULL, + job varchar(50) NULL, + acp_scopes varchar(50) NULL, + "address" varchar(50) NULL, + personlocation varchar(50) NULL, + addresslocation varchar(50) NULL, + acp_socialissues varchar(50) NULL, + work_socialaction varchar(50) NULL, + comment1_content varchar(50) NULL, + comment2_content varchar(50) NULL, + comment3_content varchar(50) NULL, + comment4_content varchar(50) NULL, + comment5_content varchar(50) NULL +); \ No newline at end of file