IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

PHP & Base de données Discussion :

Comment importer un json dans MySQL


Sujet :

PHP & Base de données

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut Comment importer un json dans MySQL
    Bonjour,

    J'ai un fichier json qui contient 1 millions de lignes. Il comprend des mesures de plusieurs capteurs sur une longue période.
    Je voulais importer ces données dans une base MySQL pour filtrer ce que l'on veut affciher. Ce qui éviterait de traiter 1 millions de ligne.

    Simplement, pour importer ce fichier dans MySQL, je suppose que l'on ne le fait pas comme-ca.

    Que me recommenderiez-vous afin de le faire le plus simplement et optimal?

    J'ai pensé à faire un script php, mais il va y avoir un timeout...

    Merci
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 234
    Points : 15 531
    Points
    15 531
    Par défaut
    est ce que le fichier contient un seul objet JSON avec tous les enregistrements ? ou alors il y a un objet par ligne ?

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Bonjour
    Je ne sais pas trop quoi répondre.
    Voici un extrait du fichier. Il m'a extrait une semaine de donné pour un station avec 12 capteurs:
    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
     
    [
        {
            "Pond": "7A",
            "ID": 2,
            "Time": "2017-10-17 00:10:00",
            "Waterlevel": 822.9023384000001,
            "Waterlevel normalized": 4.146638400000029,
            "Heatflux Shallow": 0.0,
            "Heatflux Bottom": 2.572495480310656,
            "T-Air": 8.88,
            "T-Surface": 13.84,
            "T-30mm": 14.61,
            "T-60mm": 14.63,
            "T-100mm": 14.63,
            "T-200mm": 14.61,
            "T-500mm": 14.7,
            "T-1200mm": 14.61
        },
        {
            "Pond": "7A",
            "ID": 3,
            "Time": "2017-10-17 00:20:00",
            "Waterlevel": 822.8327780000001,
            "Waterlevel normalized": 4.077078000000029,
            "Heatflux Shallow": 0.0,
            "Heatflux Bottom": 2.498340778500441,
            "T-Air": 8.66,
            "T-Surface": 14.02,
            "T-30mm": 14.57,
            "T-60mm": 14.61,
            "T-100mm": 14.61,
            "T-200mm": 14.6,
            "T-500mm": 14.58,
            "T-1200mm": 14.6
        },
        {
            "Pond": "7A",
            "ID": 4,
            "Time": "2017-10-17 00:30:00",
            "Waterlevel": 822.8916368000001,
            "Waterlevel normalized": 4.135936800000081,
            "Heatflux Shallow": 0.0,
            "Heatflux Bottom": 2.5429511600630104,
            "T-Air": 8.85,
            "T-Surface": 13.86,
            "T-30mm": 14.58,
            "T-60mm": 14.58,
            "T-100mm": 14.58,
            "T-200mm": 14.58,
            "T-500mm": 14.64,
            "T-1200mm": 14.57
        }]
    il y a 20000 lignes, alors je n'ai mis que les premières mesures

    Merci
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 234
    Points : 15 531
    Points
    15 531
    Par défaut
    votre extrait ressemble plutôt à la fin d'une liste JSON avec le "]".

    pour savoir si PHP arrive à lire le contenu, utilisez cette fonction*:
    https://secure.php.net/manual/fr/fun...son-decode.php

    Si cette fonction fait la conversion avec succès, affichez la taille du résultat pour vérifier que vous recevez tout.

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Oui pardon, j'avais mal copié le code
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Concernant le problème du timeout, la question est de savoir si tu vas exécuter ce script souvent.

    Si c'est une exécution unique (ou peu fréquente, du genre tous les 1ers du mois, ou quelque chose du genre), tant pis si ton script prend des heures à s'exécuter. Tu as juste à configurer le temps max d'exécution pour permettre à ton script de s'exécuter dans son intégralité, et éventuellement prévoir une reprise de traitement de façon à pouvoir interrompre ton script et repartir là tout il s'est arrêté.

    Pour la petite histoire, j'ai une fois travaillé sur un script de transfert de données qui s'alimentait sur plusieurs sources. On m'avait bien dit qu'une des sources avait plus de données que les autres, mais pas à quel point : L'exécution pour cette source a pris plus de 10h pour s'exécuter (contre moins d'une heure pour les autres). Je vous laisse imaginer ma journée : 9h : "C'est bon, ça tourne", 10h : "Ah ça tourne toujours" 11h : "oui, on a bien les données qui s'insèrent en base", 14h : "ça tourne encore", 15h : "Quelqu'un a accès à la source ? Ouh la ! Et donc, on en est à quelle donnée là ? ", 17h : "bon chef, d'après mon estimation, il en a encore pour plusieurs heures, alors je vais rentrer chez moi, hein..."

    Aparté mis à part, ton problème risque moins d'être le temps d'exécution que la mémoire nécessaire pour lire tout le fichier. Et là, le plus simple pour tester est de faire ce que conseille mathieu : tu essayes de lire le fichier et de le convertir par json_decode.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Bonjour,

    Mais si je dois encore éclairecir ceci, oui, il s'agit de "transférer" les valeurs du json dans une base MySQL. Dont l'opération dera faite qu'une fois.
    Mais je voulais justement éviter de reprendre l'opération parce que le script est victime d'un timeout.

    Et vu qu'il y a un million de ligne (ce qui me semble énorme), je dois m'attendree a ce que ceci ne se passe pas en un seul coup....

    Faudrait alors, que je crée un script php qui va décoder mon json puis avec une requête MySQL, l'injecter dans ma base? Mais ca ne change rien, ceci ca ne pas se faire en 60 secondes

    Ou alors faire un job, qui va m'envoyer 500 lignes toutes les 10 secondes, mais là, j'en ai pour un moment aussi... . Et puis la machine est sous Windows
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  8. #8
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Ce que je souhaite c'est d'afficher sous forme de graphique mes valeurs des capteurs qui me sont fournis dans un fichier json.

    Mais vu qu'il y en a tellement, il y aura tellement de points dans mon graphe. Donc je souhaite filtrer les points en fonction d'une date de début et de fin.

    Mas libraririre chartjs, lit très bien les fichiers json, mais elle ne filtre pas en fonction des dates et je voulais éviter qu'elle lise 1 million de lignes pour en afficher 500...

    C'est pourquoi, je voulais mettre tout ce petit monde dans une base de donnée, pour filtrer plus facilement ce que je souhaite afficher. Ca me semble être une bonne idée.
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    inutile de répéter 10 fois, on a compris.

    ...Tu as juste à configurer le temps max d'exécution pour permettre à ton script de s'exécuter dans son intégralité...



    Écris ton script, fais un essai. Tu verras bien...

  10. #10
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Au passage, je suis totalement d'accord avec toi : je ne pense pas que travailler directement avec ton fichier soit viable.

    Une alternative à ton script de chargement : Convertir ton JSON en CSV et ensuite charger le CSV dans la base, soit par un script PHP classique du type "je lis une ligne du fichier, je créé la ligne en base", soit par la fonction de MySQL LOAD DATA INFILE.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

Discussions similaires

  1. Comment importer des NULL dans mysql ?
    Par Benka dans le forum Débuter
    Réponses: 4
    Dernier message: 15/09/2010, 11h16
  2. Comment importer une DLL dans du code???
    Par Jayceblaster dans le forum Delphi .NET
    Réponses: 29
    Dernier message: 19/04/2006, 19h19
  3. Réponses: 7
    Dernier message: 23/01/2006, 11h53
  4. pb d'Import ficher sql dans mysql 4.0.24
    Par Robert92500 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 05/01/2006, 09h07
  5. Comment gérer le grec dans MySQL ?
    Par LadyArwen dans le forum Requêtes
    Réponses: 14
    Dernier message: 27/01/2005, 09h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo