Выведите JSON на несколько строк с помощью js-xlsx

Я следую одному из решений здесь. Решение хорошо выходит из системы на консоли, но я не знаю, как сохранить, поэтому его легко читать в файл.json. Я попытался с помощью модуля файловой системы записать вывод в.json. Я не знаю, как заставить его печатать все в несколько строк. Все выходит в одну строку.

var fs = require('fs');
var XLSX = require('xlsx');
var workbook = XLSX.readFile('test.xlsx');
var sheet_name_list = workbook.SheetNames;
sheet_name_list.forEach(function(y) {
    var worksheet = workbook.Sheets[y];
    var headers = {};
    var data = [];
    for(z in worksheet) {
        if(z[0] === '!') continue;
        //parse out the column, row, and value
        var col = z.substring(0,1);
        var row = parseInt(z.substring(1));
        var value = worksheet[z].v;

        //store header names
        if(row == 1) {
            headers[col] = value;
            continue;
        }

        if(!data[row]) data[row]={};
        data[row][headers[col]] = value;
    }
    //drop those first two rows which are empty
    data.shift();
    data.shift();
    //console.log(data);
    fs.writeFileSync("new.json", JSON.stringify(data), function(err) {
        if(err) {
            return console.log(err);
        }
    }); 
});

вывод new.json

[{"key":"AprilA45","Food":"Sandwich","yr":2017,"mo":"April" ...

2 ответа

Решение

Вы можете добиться этого, используя дополнительные аргументы к stringifyметод, в частности,spaceпараметр:

Объект String или Number, который используется для вставки пробела в выходную строку JSON для удобства чтения. Если это число, оно указывает количество пробелов для использования в качестве пробела; это число ограничено 10 (если оно больше, значение просто 10). Значения меньше 1 указывают, что пробел не должен использоваться. Если это строка, строка (или первые 10 символов строки, если она длиннее) используется в качестве пробела. Если этот параметр не указан (или имеет значение null), пробелы не используются.

Вот пример на основе браузера, который показывает, что вы хотите - первый div - это то, что вы получаете в настоящее время; Второй div это то, что вы хотите:

let data = {"foo": ["bar", "baz"], "qux": "quux"};
document.getElementById("first").innerHTML = "<pre>" + JSON.stringify(data) + "</pre>";
document.getElementById("second").innerHTML = "<pre>" + JSON.stringify(data, null, 2) + "</pre>";
<div id="first"></div>
<div id="second"></div>

Итак, ваш код будет:

fs.writeFileSync("new.json", JSON.stringify(data, null, 2), function(err) {
    if(err) {
        return console.log(err);
    }
}); 

Используйте Array.map и Array.join.

// Получить символ конца строки

const EOL = требуется ('os'). EOL;

// Stringify каждого объекта в массиве и присоединить массив с символом новой строки

data = data.map (obj => JSON.stringify (obj)). join (EOL);

// Записать ваши данные в файл

fs.writeFileSync(...);

Другие вопросы по тегам