web-dev-qa-db-fra.com

Analyser le fichier CSV distant avec Nodejs/Papa Parse?

Je travaille actuellement sur l'analyse d'un flux de produits csv distant à partir d'une application Node et j'aimerais utiliser Papa Parse pour le faire (car j'ai déjà eu du succès avec cela dans le navigateur).

Papa Parse Github: https://github.com/mholt/PapaParse

Mes tentatives initiales et ma recherche sur le Web n'ont pas révélé exactement comment cela serait fait. Le fichier Lisez-moi de Papa indique que Papa Parse est désormais compatible avec Node et que Baby Parse (qui servait auparavant une partie de la fonctionnalité d'analyse de nœud) a été amorti. 

Voici un lien vers la section Nœud de la documentation pour tous ceux qui tombent sur cette question à l'avenir: https://github.com/mholt/PapaParse#papa-parse-for-node

D'après ce paragraphe de document, il semble que Papa Parse in Node puisse analyser un flux lisible au lieu d'un fichier. Ma question est; 

Existe-t-il un moyen d'utiliser la fonctionnalité Readable Streams pour utiliser Papa afin de télécharger/analyser un fichier CSV distant dans Node? Quelque chose de similaire à la manière dont Papa dans le navigateur utilise XMLHttpRequest pour atteindre le même objectif?

Pour une visibilité future Pour ceux qui effectuent une recherche sur le sujet (et pour éviter de répéter une question similaire) qui tentent d'utiliser la fonctionnalité d'analyse de fichier à distance décrite ici: http://papaparse.com/docs#remote- files entraînera l'erreur suivante dans votre console:

"Rejet non géré ReferenceError: XMLHttpRequest n'est pas défini"

J'ai ouvert un problème sur le référentiel officiel et mettrai à jour cette question à mesure que j'en apprendrai davantage sur les problèmes à résoudre.

6
Necevil

En fait, vous pouvez utiliser une bibliothèque de transformation de flux léger appelée scramjet . L'analyse de fichiers CSV directement à partir d'un flux http est l'un de mes principaux exemples. Il utilise également PapaParse pour analyser les fichiers CSV.

Tout ce que vous avez écrit ci-dessus, avec toutes les transformations entre les deux, peut être fait en quelques lignes:

const {StringStream} = require("scramjet");
const request = require("request");

request.get("https://srv.example.com/main.csv")   // fetch csv
    .pipe(new StringStream())                       // pass to stream
    .csvParse()                                   // parse into objects
    .consume(object => console.log("Row:", object))  // do whatever you like with the objects
    .then(() => console.log("all done"))

Dans votre propre exemple, vous enregistrez le fichier sur le disque, ce qui n’est pas nécessaire, même avec PapaParse.

2
Michał Kapracki

OK, alors je pense avoir une réponse à cela. Mais je suppose que seul le temps nous le dira. Notez que mon fichier est .txt avec des délimiteurs de tabulation.

var fs = require('fs');
var Papa = require('papaparse');
var file = './rawData/myfile.txt';
// When the file is a local file when need to convert to a file Obj.
//  This step may not be necissary when uploading via UI
var content = fs.readFileSync(file, "utf8");

var rows;
Papa.parse(content, {
    header: false,
    delimiter: "\t",
    complete: function(results) {
        //console.log("Finished:", results.data);
    rows = results.data;
    }
});
5
TheDuke

J'ajoute cette réponse (et la mettrai à jour au fur et à mesure que je progresse) au cas où quelqu'un d'autre étudie toujours la question.

Il semble que les utilisateurs précédents ont fini par télécharger le fichier puis le traiter. Cela NE DEVRAIT PAS être nécessaire, car Papa Parse devrait pouvoir traiter un flux de lecture et il devrait être possible de diriger le canal 'http' GET vers ce flux.

Voici un exemple de quelqu'un qui discute de ce que je tente de faire et retombe dans le téléchargement du fichier puis l’analyse: https://forums.meteor.com/t/processing-large-csvs-in-meteor-js -with-papaparse/32705/4

Remarque: dans ce qui précède, Baby Parse fait l’objet d’une discussion, maintenant que Papa Parse fonctionne avec Node Baby Parse est amorti.

Télécharger la solution de contournement

Tandis que télécharger puis analyser avec Papa Parse n’est pas une réponse à ma question, c’est la seule solution de contournement que j’ai à l’heure actuelle et quelqu'un d'autre voudra peut-être utiliser cette méthodologie.

Mon code à télécharger et à analyser ressemble actuellement à ceci:

// Papa Parse for parsing CSV Files
var Papa = require('papaparse');
// HTTP and FS to enable Papa parse to download remote CSVs via node streams.
var http = require('http');
var fs = require('fs');

var destinationFile = "yourdestination.csv";

var download = function(url, dest, cb) {
  var file = fs.createWriteStream(dest);
  var request = http.get(url, function(response) {
    response.pipe(file);
    file.on('finish', function() {
      file.close(cb);  // close() is async, call cb after close completes.
    });
  }).on('error', function(err) { // Handle errors
    fs.unlink(dest); // Delete the file async. (But we don't check the result)
    if (cb) cb(err.message);
  });
};

download(feedURL, destinationFile, parseMe);

var parseMe = Papa.parse(destinationFile, {
  header: true,
  dynamicTyping: true,
  step: function(row) {
    console.log("Row:", row.data);
  },
  complete: function() {
    console.log("All done!");
  }
});
1
Necevil