@wasiliev96

Как грамотно пропарсить скопированные колонки с google sheets?

Копируются колонки из google sheets, на выходе много строк вида:
"some_text
some_another_text"	 18.01.1956

Строка в кавычках имеет перенос строки, после закрывающей кавычки идет пробел и дата строго такого формата.

Необходимо из этих строк создать обьекты вида:
{
field1: "some_text",
field2: "some_another_text",
date: "18.01.1956"
}
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ответы на вопрос 2
Psixodelik
@Psixodelik
Преподаватель на Hexlet
Можно сделать через регулярку. При условии, что объекты строки будут иметь одинаковую структуру.

https://repl.it/@NikitaMikhailov/regex
Ответ написан
Комментировать
zkrvndm
@zkrvndm
Архитектор решений
У меня однажды возникла задача, спарсить данные с Google таблицы не используя их API.

В итоге, вот какое решение я придумал:
googleTableParse('https://docs.google.com/spreadsheets/d/<код документа>/edit');

// Функция для парсинга Google таблицы:

async function googleTableParse(link) {
	
	var url = link.replace(/edit$/g, 'export?format=zip');
	var response = await fetch(url);
	var zip = await response.blob();
	var archive = await new JSZip().loadAsync(zip);
	var files = Object.keys(archive.files);
	var lists = Object.create(null);
	for (var n = 0; n < files.length; n++) {
		if (!files[n].includes('/') && files[n].includes('.html')) {
			var blob = await archive.files[files[n]].async('blob');
			var html = await blob.text();
			var name = files[n].replace(/\.html$/g, '');
			lists[name] = tableParser(html);
		}
	}
	
	console.log('Таблица и все листы в нём успешно спарсены:');
	console.dir(lists);
	
}

// Функция для парсинга html-кода таблицы из скачанного архива:

function tableParser(html) {
	
	var doc = new DOMParser().parseFromString(html, "text/html");
	
	var th = doc.querySelector('table > tbody > tr').querySelectorAll('th, td');

	var title = [];

	for (var i = 0; i < th.length; i++) {

		title.push(th[i].innerText);

	}
	
	var tr = doc.querySelectorAll('table > tbody > tr');
	
	var array = [];
	
	for (var i = 1; i < tr.length; i++) {

		var td = tr[i].querySelectorAll('th, td');
		
		var obj = {};
		var add = 0;
		
		for (var y = 1; y < td.length; y++) {
			
			td[y].innerHTML = td[y].innerHTML.replace(/\<br\>/g, '{перенос строки}');
			obj[title[y]] = td[y].innerText.replace(/\{перенос строки\}/g, "\n").trim();
			if (obj[title[y]] !== '') {
				add = 1;
			}
			
		}
		
		if (add) {
			array.push(obj);
		}

	}
	
	return array;
	
}


Для работы функции должно выполнятся 2 условия:
1. Должна быть подключена библиотека JSZip, которая позволяет работать с zip-архивами на JavsScript
2. Каким-то образом вы должны добавить разрешающий заголовок Access-Control-Allow-Origin на все запросы к серверам Google. Лично я это сделал, через использование расширения и файла background.js но это не единственный вариант. Можно для выполнения кода использовать NodeJS или как-то проксировать процесс закачки файла.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы