Преобразовать столбцы в строки в JS
Буду благодарен за любую помощь. Немного изучал только JS, поэтому пишу в нем.
Задача: есть данные социологического опроса, они вбиты столбцом.
Вид примерно следующий:
*222
1 3 5
2 3 4
1 2
*223
2
3 4
1
Звездочкой обозначен номер анкеты. Строки - вопросы в анкете. Цифры в строках - выбранные варианты ответов на вопрос.
Необходимо данные преобразовать в csv формат, для дальнейшего импорта в Excel. В нем будут по порядку столбцами все вопросы отображены и все варианты ответов на них. Выбранные варианты ответов надо отметить как 1, не выбранные как 0. Количество ответов на каждый вопрос известно.
Итого каждая новая строка будет соответствовать новой анкете и если вариантов ответа на 1 вопрос например 6, на 2й - 4, на 3й - 2, то будет выложенный в начале пример должен выглядеть вот так.
222;1;0;1;0;1;0;0;1;1;1;1;1;
223;0;1;0;0;0;0;0;0;1;1;1;0;
Мне кроме того, чтобы создать массив для каждой строки с заданным количеством элементов в голову ничего не пришло, в сторону каких функций смотреть тоже не понятно, поэтому прошу помощи.
Ответы (1 шт):
На основе приведённых данных и условий, если я правильно понял, то здесь уместны регулярные выражения и метод split(). Возможно, что кто-нибудь даст ответ более лаконичный, но тут больше наглядность и половина кода - комментарии.
// Массив значений количества вариантов для каждого вопроса
const VARIANTS_NUMB = [6, 4, 2];
// Разбивка на анкеты
const QUESTIONNAIRES = [...source.value.matchAll(/(?:\*)(?<numb>[\d]+)(?<asks>[^*]+)/g)];
/* Перебор анкет */
QUESTIONNAIRES.forEach((q_curr) => {
// Номер текущей анкеты
let q_numb = q_curr.groups['numb'];
// Массив ответов текущей анкеты
let q_asks = q_curr.groups['asks'].trim().split('\n');
// Строка для CSV
let answers = '';
/* Перебор значений количества вариантов */
VARIANTS_NUMB.forEach((v_numb, i) => {
// Массив вариантов
let variant = q_asks[i].split(' ');
/* Перебор вариантов */
for (let v = 1; v <= v_numb; v++) {
// Добавление значения в результат на основе наличия номера варианта
answers += `${variant.includes(`${v}`) ? 1 : 0};`;
}
});
// Вывод результата
target.value += `${q_numb};${answers}\n`;
});
<textarea id="source" cols="30" rows="10">
*222
1 3 5
2 3 4
1 2
*223
2
3 4
1
</textarea>
<textarea id="target" cols="30" rows="10"></textarea>