#javascript #json #csvtojson
#javascript #json #csvtojson
Вопрос:
Я новичок в Javascript, может быть, вы можете помочь мне понять это. Все приведенные здесь примеры csvtojson показывают запись в консоль, которая работает нормально:
https://www.npmjs.com/package/csvtojson#from-csv-file-to-json-array
const csvFilePath='<path to csv file>'
const csv=require('csvtojson')
csv()
.fromFile(csvFilePath)
.then((jsonObj)=>{
console.log(jsonObj);
})
Мой вопрос — как мне использовать jsonObj вне этой области? Мне просто нужна простая глобальная переменная, с помощью которой я смогу получить доступ к JSON позже в скрипте.
Комментарии:
1.Вы можете попробовать использовать
async
await
или функцию обратного вызова.2. Есть какие-нибудь простые примеры, чтобы я мог понять, как это работает? Я видел несколько ссылок на использование «асинхронного», но нет основных примеров того, как это сделать. Просто консоль. журнал, который мне не помогает…
3. Привет, я добавил пример ниже. Если у вас есть какие-либо вопросы, просто спросите 🙂
Ответ №1:
Вы можете использовать IIFE (выражение функции, вызываемое немедленно), чтобы обернуть весь ваш асинхронный код и сохранить значение в глобальной переменной, а также получить доступ к нему внутри асинхронного IIFE. Чтобы сохранить значение и получить к нему доступ из любого места, вам нужно дождаться результата, а затем получить доступ к значению из-за асинхронной и однопоточной природы js.
const csv = require('csvtojson');
let arr = [];
(async function () {
const json = await csv().fromFile('./demo.csv');
await arr.push(json);
console.log(arr);
})()
Комментарии:
1. Я не думаю, что это правильно. Моя среда разработки говорит, что
await arr.push(json)
строка не имеет никакого эффекта, и хочет удалить ожидание. Такжеarr
недоступен вне функции. 🙁2. Почему
await arr.push(json)
это неправильно? Не могли бы вы объяснить? Чтобы сохранить значение и получить к нему доступ из любого места, где вы используетеpromise
, вам нужно дождаться результата, а затем получить доступ к значению из-за асинхронной и однопоточной природы js.3. Или вы можете использовать любой синхронный метод. Но это заблокирует ваш основной поток.
Ответ №2:
Вы можете использовать пакет npm «convert-excel-to-json». Пример выглядит следующим образом:
'use strict';
const excelToJson = require('convert-excel-to-json');
const result = excelToJson({
sourceFile: 'SOME-EXCEL-FILE.xlsx'
});
// result will be an Object containing keys with the same name as the sheets found on the excel file. Each of the keys will have an array of objects where each of them represents a row of the container sheet. e.g. for a excel file that has two sheets ('sheet1', 'sheet2')
{
sheet1: [{
A: 'data of cell A1',
B: 'data of cell B1',
C: 'data of cell C1'
}],
sheet2: [{
A: 'data of cell A1',
B: 'data of cell B1',
C: 'data of cell C1'
}]
}
Затем вы можете использовать результирующий объект где угодно.
Ответ №3:
Вы можете попробовать использовать async
и await
, просто напишите некоторый код, который вы хотите выполнить в IIFE, например:
const csvFilePath = './aCSV.csv';
const csv = require('csvtojson');
// a IIFE
(async () => {
const jsonObj = await csv().fromFile(csvFilePath);
console.log(jsonObj);
// [ { a: '1', b: '2', c: '3' }, { a: '4', b: '5', c: '6' } ]
})();
Ответ №4:
Я использую пакет npm convert-csv-to-json. https://www.npmjs.com/package/convert-csv-to-json
let csv2Json = require('convert-csv-to-json');
let fileInputName = 'stores.csv';
let fileOutputName = 'stores.json';
csv2Json.fieldDelimiter(',').generateJsonFileFromCsv(fileInputName, fileOutputName);
let json = csv2Json.getJsonFromCsv("stores.csv");
for(let i=0; i<json.length;i ){
console.log(json[i]);
}