2017-01-05 2 views
0

Ich scrappe eine Webseite mit vielen Daten darauf, formatiert als HTML-Tabelle. Sie müssen ein Formular senden, um die Tabelle zu generieren. Mein Knotenscript übergibt alle Permutationen des Formulars und jedes Mal kratzt die resultierende Tabelle, wobei jede Zeile in eine Datenzeile umgewandelt wird.Node.js: fs writestream beendet das Schreiben in Datei, wenn die Datei zu groß wird

Das Problem ist, wenn ich die Daten in eine Datei schreibe, funktioniert es nicht mehr, wenn die Datei etwa 10 MB groß wird. Manchmal ist es ein bisschen weniger; manchmal ein bisschen mehr. Ich habe versucht, die Datei als .csv, .json und .txt zu schreiben, und jedes Mal tritt das gleiche Problem auf.

Ich verwende fs, um diese Aufgabe auszuführen. Der entsprechende Code ist:

var fs = require("fs"); 
var stream = fs.createWriteStream("data.csv"); // can also be .json or .txt 

stream.write(line_of_data); 

Ich kann console.log(line_of_data) und es funktioniert gut, den ganzen Weg durch, bis es keine Daten gibt kratzen gelassen. Bei etwa 10 MB akzeptiert die Ausgabedatei jedoch keine weiteren Datenzeilen. Der Haltepunkt scheint fast völlig willkürlich - jedes Mal, wenn ich das Skript ausführe, hört es auf, an einem anderen Punkt zu schreiben. Ich habe reichlich Speicherplatz auf meiner Festplatte, also muss das Problem mit etwas anderem zu tun haben.

+0

Können Sie verschiedene resultierende Tabellen in verschiedenen Dateien speichern und sie am Ende mit etwas anderem als nodeJS zusammenführen? – atayenel

+0

siehe diese Antwort http://stackoverflow.com/questions/9486683/writing-large-files-with-node-js –

Antwort

0

Ich endete mit MongoDB, um die Daten zu speichern. Führen Sie npm install mongodb --save aus, um MongoDB als ein Knotenmodul zu installieren. Die entsprechende Javascript ist:

  1. Export als CSV: mongoexport --db database --collection collection --out data.csv --type=csv --fields 'field1, field2, field3, etc.'
  2. zu JSON konvertieren: csvtojson data.csv > data.json (erfordert csvtojson)
  3. Validate JSON:

    MongoClient = require("mongodb").MongoClient; 
    MongoClient.connect("mongodb://localhost:27017/database", function(err, db) { 
    
        if (!err) { 
    
        // set up mongodb collection 
        db.createCollection("collection", function(err, collection) {}); 
        var collection = db.collection("collection"); 
    
        // after scraping data... 
        // insert a data object (line_of_code) 
        collection.insert(line_of_data, {w: 1}, function(err, result) { 
         if (err) console.log(err); 
        }); 
    
        } 
    
    }); 
    

    Einige Befehle, um die Daten zu konvertieren jsonlint data.json (erfordert jsonlint)

Verwandte Themen