Add another method to prepare the import tables
This commit is contained in:
parent
9c90e5ac07
commit
db52c72d22
49
README.md
49
README.md
@ -1,12 +1,12 @@
|
|||||||
CHILL - Reprise de données
|
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.
|
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.
|
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
|
## 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.
|
Le fichier se compose de plusieurs feuilles, chacune doit être sauvée au format csv.
|
||||||
|
|
||||||
Pour préparer les fichiers on va:
|
Pour préparer les fichiers on va:
|
||||||
- nettoyer le fichier pour ne laisser en étiquette que les noms de colonnes en anglais.
|
- 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 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,
|
- ajouter les doublequote lors de la sauvegarde du csv,
|
||||||
- enlever tous les line breaks et caractères spéciaux.
|
- enlever tous les line breaks et caractères spéciaux.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Exemple de remplacements exécutés sur les fichiers csv pour un import spécifique :
|
# 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
|
$ sed -e 's#"end"#"end"\n#g' < file.3.csv > file.4.csv
|
||||||
|
|
||||||
# Exemple pour un autre import:
|
# Exemple pour un autre import:
|
||||||
$ cat file2.csv | sed -e 'N; s#_x000D_##g; s#\n##g; s/$CR//g' | tr "\n" " " > file3.csv
|
$ 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#"endcol"#"endcol"\n#g; s#"endrow"#"endrow"\n#g' < file3.csv > file4.csv
|
||||||
$ sed -e 's#^,##g; s#^ ##g' < file4.csv > file5.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.choix_periodes
|
||||||
- import.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.
|
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
|
### 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.
|
- 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
|
#### 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'
|
- cocher 'first row is header'
|
||||||
- 'null value text': undefined (pas de champs null dans la table, mais un texte vide)
|
- 'null value text': undefined (pas de champs null dans la table, mais un texte vide)
|
||||||
- then > open table
|
- 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
|
- then > import
|
||||||
#### Exporter en sql
|
#### Exporter en sql
|
||||||
- créer un fichier `<client>-data.sql` vide
|
- créer un fichier `<client>-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)
|
- 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 `<client>-data.sql`
|
- coller les données dans `<client>-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)
|
## 3. Import du schéma 'import' sur le serveur (safran)
|
||||||
|
|
||||||
- transférer le fichier `<client>-data.sql` sur le serveur (avec scp):
|
- transférer le fichier `<client>-data.sql` sur le serveur (avec scp):
|
||||||
```bash
|
```bash
|
||||||
$ scp cyclo-data.sql debian@safran:~/data/tmp/
|
$ 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
|
-- vérifier que le schéma import est en place
|
||||||
cycloprod=# \dt import.*
|
cycloprod=# \dt import.*
|
||||||
List of relations
|
List of relations
|
||||||
Schema | Name | Type | Owner
|
Schema | Name | Type | Owner
|
||||||
--------+-----------------+-------+----------
|
--------+-----------------+-------+----------
|
||||||
import | choix_periodes | table | postgres
|
import | choix_periodes | table | postgres
|
||||||
import | choix_personnes | table | postgres
|
import | choix_personnes | table | postgres
|
||||||
@ -100,7 +117,7 @@ cycloprod=# \dt import.*
|
|||||||
(4 rows)
|
(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.
|
Se fait dans la console postgresql, en tant que user postgres, en étant connecté à la base de donnée cible.
|
||||||
|
|
||||||
|
79
sql/prepare-import.sql
Normal file
79
sql/prepare-import.sql
Normal file
@ -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
|
||||||
|
);
|
Loading…
Reference in New Issue
Block a user