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

NodeJS Discussion :

Convertir certaine ligne csv nodejs


Sujet :

NodeJS

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    ETUDIANT
    Inscrit en
    janvier 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : ETUDIANT
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2020
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Convertir certaine ligne csv nodejs
    Bonjour !

    Alors je travail sur une application nodeJS actuellement et j'ai un système qui permet d'upload un fichier de type CSV et qui met à jour la base de donnée directement.

    Mon problème est que j'aimerai ne pas upload tout le fichier CSV, et supprimer des lignes quand je clique sur envoyer la demande (voir images).

    Nom : Screenshot_1.png
Affichages : 29
Taille : 4,3 Ko

    J'aimerais supprimer mes 5 premières lignes du document ainsi que ceux où le nom du fournisseur c'est NE PLUS UTILISER comme dans l'image ci-dessous.

    Nom : Screenshot_2.png
Affichages : 28
Taille : 1,0 Ko

    Voici le code pour vous aidez à comprendre.

    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
    const csv = require('csvtojson');
    const fs = require('fs');
     
    const CSV_RETURN_CODES = {
      ERRORS: 'Le fichier a été importé avec succès mais avec des erreurs non bloquantes.',
      SUCCESS: 'Le fichier a été importé avec succès.',
    };
     
    module.exports.CSV_RETURN_CODES = CSV_RETURN_CODES;
    module.exports.Csv = class Csv {
      constructor(filePath) {
        this.filePath = filePath;
        // this.filePath = './temp/fournisseurs.csv';
      }
     
      async toJson(Model, callback) {
        const rows = [];
        await csv({
          delimiter: [';'],
          ignoreEmpty: true,
          noheader: false,
          headers: ['id', 'raison_sociale', 'mail', 'tel', 'adresse', 'cp', 'localite'],
        })
          .fromFile(this.filePath)
          .on('json', async (jsonObj) => {
            try {
              if (jsonObj.id !== '' && Number.isInteger(parseInt(jsonObj.id, 10)) && parseInt(jsonObj.id, 10) < 5000000) {
                rows.push(Model.upsert(jsonObj));
              }
            } catch (e) {
              console.error(e);
            }
          })
          .on('end', async (err) => {
            fs.unlinkSync(this.filePath);
            try {
              await Promise.all(rows);
              if (err) {
                console.error(err);
                return callback(CSV_RETURN_CODES.ERRORS);
              }
              console.log('Fournisseurs importés avec success');
              return callback(CSV_RETURN_CODES.SUCCESS);
            } catch (e) {
              console.error(e);
            }
          });
      }
    };
    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
    54
    55
    56
    57
    /*
        Import fournisseurs
      */
     
      $('#fournisseurs-input').fileinput({
        language: 'fr',
        showUpload: false,
        showCaption: false,
        showPreview: false,
        allowedFileExtensions: ['csv']
      });
     
      $('#importer-fournisseurs').click(function() {
        const fichier = $('#fournisseurs-input').prop('files')[0];
        let form = $('#form-import-fournisseurs');
        $(this).button('loading');
        console.log(form);
        if(fichier) {
          let payload = new FormData();
          payload.append('fichier', fichier);
          $.ajax({
            url: form.attr('action'),
            type: form.attr('method'),
            data: payload,
            processData: false,
            contentType: false,
            success: function () {
              $('#importer-fournisseurs').button('reset');
              displaySuccess('Fournisseurs ajoutés avec <strong>succes</success>');
            },
            error: function () {
              $('#importer-fournisseurs').button('reset');
              displayError('lors de l\'ajout des utilisateurs !');
            },
          });
        }
        else {
          $('#importer-fournisseurs').button('reset');
          displayError('Veuillez insérer un fichier à importer');
        }
      });
     
      $('#fournisseurs-input').on('fileloaded', function (event, file) {
        const label_selector = '#label-fournisseurs-input';
        $(label_selector).text(file.name.substring(0, 25) + '...');
        $(label_selector).attr('title', file.name);
      });
     
      $('#fournisseurs-input').on('fileclear', function () {
        $('#label-fournisseurs-input').text('');
      });
     
      $('#fournisseurs-input').on('fileerror', function () {
        $(this).fileinput('clear');
        $('#label-fournisseurs-input').text('Extension invalide. Utilisez des .csv');
        displayError('Extension invalide. Utilisez des .csv');
      });
    HTML :

    Code html : 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
    <div class="row">
      <div class="col-md-6">
        <form id="form-import-fournisseurs" action="/fournisseurs/import" method="POST">
     
          <h1>Importer les fournisseurs</h1>
     
          <p>Le fichier doit être dans le fomat CSV (séparateur 'point-virgule').</p>
     
          <div class="form-group col-md-5">
            <label for="fournisseurs-input">Fichier:
              <span id="label-fournisseurs-input"></span>
            </label>
            <input id="fournisseurs-input" type="file" accept=".csv" class="fileinput">
          </div>
     
          <div class="hidden divider"></div>
     
          <button id="importer-fournisseurs" type="button" class="btn btn-success"
          data-loading-text="<i class='glyphicon glyphicon-refresh spinner'></i> Importation en cours">
            <span class="glyphicon glyphicon-ok"></span>
            {{i18n "bon_commande.btn_envoyer"}}
          </button>
     
          <div id="messages-zone"></div>
      </div>
    </div>

    Merci par avance pour votre aide !

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    juin 2010
    Messages
    3 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : juin 2010
    Messages : 3 022
    Points : 6 549
    Points
    6 549
    Par défaut
    Bonjour !

    Je pense que le truc qui te manque c’est FileReader. Ça va s’insérer quelque part entre tes deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const fichier = $('#fournisseurs-input').prop('files')[0];
     
    // ...
     
    payload.append('fichier', fichier);
    Le principe est assez simple, c’est un objet qui lit le fichier de manière asynchrone et te renvoie le résultat sous une forme voulue ; en l’occurence on va choisir la forme texte avec .readAsText(). Le résultat ou l’erreur se gèrent avec des fonctions de rappel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    const reader = new FileReader();
     
    reader.onerror = function () {
      console.error(reader.error);
      // insérer dans la page un message d’erreur adressé à l’utilisateur (pas de détails techniques)
    };
     
    reader.onload = function () {
      // ...
    };
     
    reader.readAsText(fichier);
    (Je rajoute vite fait un mot à propos du message d’erreur. D’après la spec, un FileReader peut émettre trois types d’erreur : le fichier est introuvable, le fichier est illisible, ou il y a un problème de permissions. Tu peux utiliser la propriété .name pour connaître le type d’erreur et tenter d’afficher un message à peu près adapté à la situation.)

    Dans le .onload, je propose de découper la chaîne en lignes et utiliser les méthodes de Array. J’utilise un second tableau pour empiler les lignes à garder, parce que je ne sais jamais si ça se passe bien quand on supprime des lignes en place pendant une itération

    À la fin, pour coller les morceaux ensemble, on aura besoin de Blob qui nous permettra de reconvertir notre chaîne en un objet que FormData enverra de la même façon que le fichier original. Ainsi, on n’a pas besoin de modifier le code serveur.

    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
    reader.onload = function () {
      const lines = reader.result.split(/\r?\n/);
      const n = lines.length;
      const linesToKeep = [];
     
      // on commence à 5
      for (let i = 5; i < n; i++) {
        const line = lines[i];
        // on garde seulement si la ligne ne contient pas « NE PAS UTILISER »
        if (line.indexOf('NE PAS UTILISER') < 0) {
          linesToKeep.push(line);
        }
      }
     
      const blob = new Blob(linesToKeep, { type: 'text/csv' }); // le type est optionnel, je l’ai mis pour l’exemple
      payload.append('fichier', blob);
     
      $.ajax({
        // ...
        // ... (ne change pas)
        // ...
      });
    };
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

Discussions similaires

  1. Ignorer certaines lignes d'un fichier "csv"
    Par Keyem dans le forum Langage
    Réponses: 10
    Dernier message: 19/06/2013, 11h41
  2. Lire certaines lignes d'un fichier csv
    Par damdam44 dans le forum APIs
    Réponses: 5
    Dernier message: 12/05/2008, 12h29
  3. Masquer certaines lignes sur un etat
    Par badara2 dans le forum Access
    Réponses: 3
    Dernier message: 15/10/2005, 20h24
  4. Réponses: 7
    Dernier message: 04/06/2005, 00h26
  5. Récupéré l'identifiant d'une certaine ligne
    Par Trunks dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/01/2005, 02h08

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