2016-07-11 5 views
3

eine CSV-Datei lesen line-by-line (dh ohne die gesamte Datei in den Speicher geladen) in Python ist einfach:Lesen Sie eine CSV-Datei line-by-line mit node.js und ES6/ES7 verfügt

import csv 
for row in csv.reader(open("file.csv")): 
    print(row[0]) 

Das Gleiche mit node.js zu tun beinhaltet etwas wie node-csv, Streams und Callbacks.

Ist es möglich, neue ES6/ES7-Funktionen wie Iteratoren, Generatoren, Versprechen und asynchrone Funktionen zu verwenden, um Zeilen einer CSV-Datei auf eine Weise zu durchlaufen, die eher dem Python-Code ähnelt?

Im Idealfall würde Ich mag Lage sein, so etwas zu schreiben: (. Wieder, ohne sofort die gesamte Datei in den Speicher geladen)

for (const row of csvOpen('file.csv')) { 
    console.log(row[0]); 
} 

+0

werfen Sie einen Blick auf http://papaparse.com/ – Cloxure

+0

PapaParse verwendet Rückrufe, die diese Frage zu vermeiden versucht. – danvk

+1

FYI, ES7 führt nur 'Array # includes' und den Potenzierungsoperator ein. Keines davon wird hier helfen. Async-Funktionen sind ein Vorschlag. Auch bei asynchronen Funktionen benötigen Sie einen Rückruf auf oberster Ebene. –

Antwort

1

Ich bin nicht vertraut mit Knoten -csv, aber es klingt wie ein Iterator mit einem Generator sollte es tun. Wickeln Sie einfach, dass um jeden asynchronen Callback-API:

let dummyReader = { 
    testFile: ["row1", "row2", "row3"], 
    read: function(cb) { 
    return Promise.resolve().then(() => cb(this.testFile.shift())).catch(failed); 
    }, 
    end: function() { 
    return !this.testFile.length; 
    } 
} 

let csvOpen = url => { 
    let iter = {}; 
    iter[Symbol.iterator] = function*() { 
    while (!dummyReader.end()) { 
     yield new Promise(resolve => dummyReader.read(resolve)); 
    } 
    } 
    return iter; 
}; 

async function test() { 
    // The line you wanted: 
    for (let row of csvOpen('file.csv')) { 
    console.log(await row); 
    } 
} 

test(); // row1, row2, row3 

var failed = e => console.log(e.name +": "+ e.message); 

Beachten Sie, dass row hier ein Versprechen ist, aber nahe genug.

Fügen Sie es in babel.

Verwandte Themen