我試圖使用npm包csv-parser來解析我的csv文件,並遇到事件發生順序的問題。使用csv解析器的同步發射事件
活動發射順序
- 「頭」:要插入瞭解CSV元數據到數據庫中,並返回一個ID值
- 「數據」:想用值從返回的ID頭事件的所有數據事件
- '數據'
- '數據'
- ...
- 結束
顯然,節點的異步性質意味着我在'headers'中緩慢的數據庫訪問在第一個'data'事件發出時沒有返回,因此我沒有csv的id。我能想到的唯一選擇是將所有數據行緩存到某個臨時變量中,然後在讀取完整個csv後再推送所有數據。考慮到我可能有非常大的csv文件,這似乎是一個壞主意?任何關於解決這個問題的更好方法的建議?
編輯:添加一些代碼(僞代碼,沒有實際測試過)
let headerList = null;
let dataArray = [];
fs.createReadStream(path)
.pipe(csv())
// Parse the headers into a comma delimminated string
.on('headers', function(headers) {
// some parsing logic and then assigned to variable
headerList = headers;
})
.on('data', function (data) {
// Some push of data into a variable
dataArray.push(data);
})
.on('end', function() {
// create the base upload object
const id = uploads.createUpload(filename, headerList, new Date());
// insert data
uploads.insertUploadData(id, dataArray);
})
也許讀取第一行,只是爲了獲取元數據。進行數據庫調用。當第一次數據庫調用返回id時,則執行完整的解析過程......然後,您不必緩存任何內容。只要讀第一行兩次。 – joshp
是的,這不是一個壞主意。沒有想到這樣做。 – Daniel