Как я могу проанализировать данные из CSV-файла, загруженного пользователем в узел / экспресс?
У меня есть приложение переднего плана реагирования и приложение backend node/express. Я хочу разрешить пользователю загружать CSV-файл, затем анализировать файл и создавать модель для каждой строки. Тем не менее, я несколько озадачен тем, как это сделать, поскольку я привык просто отправлять сообщения по маршруту в API и сохранять их в теле запроса. В этом случае в теле запроса есть файл, и я не хочу сохранять файл, только данные внутри него. Как я могу разобрать файл, не сохраняя его в базе данных? Я пытался использовать multer для обработки загрузки и csv-parse для анализа содержимого, но я не уверен, что это имеет смысл. Тем не менее, вот код (приложение / индекс):
...
const multer = require('multer');
const upload = multer().single();
const parse = require('csv-parse');
...
router.post('/distributor/:id/files', (req,res) => {
upload(req, res, function (err) {
if (err) {
console.error("An error occurred when uploading. Please try again. Note
that you may only upload one file at a time, and we only support .csv
files.")
return
}
console.log("We have received your file")
})
});
...
// router.get('/distributor/:id/files/:id', (req, res) => {
// File
// .forge({id: req.params.id})
// .fetch()
// .then((file) => {
// if (_.isEmpty(file))
// return res.sendStatus(404);
// return parseJson(file)
// })
// .then((jsonData) => {
// for (var i in jsonData) {
// //save instance of model
// }
// })
// .catch((error) => {
// console.error(error);
// return res.sendStatus(500);
// });
// })
// function parseJson(file) {
// var output = [];
// // Create the parser
// var parser = parse({delimiter: ':'});
// // Use the writable stream api
// parser.on('readable', function(){
// while(record = parser.read()){
// output.push(record);
// }
// });
// // Catch any error
// parser.on('error', function(err){
// console.log(err.message);
// });
// parser.end();
// }
Я знаю, что это не имеет смысла, так как на самом деле я не хочу сохранять файл как модель и таблицу в базе данных, я просто хочу сохранить каждый элемент внутри файла, поэтому я знаю, что не могу создать маршрут с именем '/ дистрибьютор /: идентификатор / файлы /: идентификатор. Но я заблудился относительно того, что делать вместо этого. Я надеюсь, что то, что я пытаюсь сделать, ясно! Я довольно новичок в ноде и программировании в целом, и я никогда не сталкивался с ситуацией, в которой мне нужно было обрабатывать загрузку файлов.
1 ответ
Вы можете использовать этот модуль узла для анализа файла CSV. https://www.npmjs.com/package/csvtojson
Например, у вас есть имя файла users
в объекте запроса.
const csv=require('csvtojson');
csv()
.fromString(req.files.users.data.toString('utf8'))
.on('json', (user) => {
console.log(user);
})
.on('done', () => {
console.log('done parsing');
});
Вы сможете получить каждую строку как объект json.