Преобразовать столбцы в строки в 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 шт):

Автор решения: UModeL

На основе приведённых данных и условий, если я правильно понял, то здесь уместны регулярные выражения и метод 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>

→ Ссылка