RU

QSP импорт google таблиц/excel

Jorge #2671 25.05.2023 05:36 1 comment 2181 views

Для тех кто еще сомневается в многомерных массивах и/или приверженец консервативного QSP 5.7.0
Есть желание редактировать таблицу в google таблиц/excel.
Есть таблица с некими предметами и их свойствами и описанием

0 Мяч предмет 10 0
1 Меч оружие 1000 100
2 Стакан предмет 5 0
3 Хлеб еда 20 -10
4 ёж животное 10 0
5 Ледоруб оружие 100 50

напрямую QSP player работать с файлами не умеет. Пойдем по пути кодогенерации. Сперва добавим локацию-обработчик ‘add’

“Код локации ‘add’”

Spoiler
!$ARGS[0] - список массивов
!$ARGS[1] - строка данных

!INSTR([$Что ищем],[$Где ищем]) - возвращает номер позиции символа, с которого начинается вхождение строки [$Что ищем] в строку [$Где ищем] (или 0, если вхождения нет). Поиск начинается с символа номер [#начало].
!$TRIM([$стр]) - удаляет прилегающие пробелы и символы табуляции из [$стр] и возвращает полученную строку.
!$MID([$стр],[#начало],[#длина]) - вырезает из строки [$стр] строку, которая начинается с символа номер [#начало] и имеет длину [#длина]. Нумерация символов в строке ведётся с 1.
!LEN([$стр]) - возвращает длину строки

!Разделитель
$Separ='	'

!убираем первый разделитель
$add_text0=$MID($ARGS[0],2)
$add_text1=$MID($ARGS[1],2)

!$addName - наименование массива и переменной из первой колонки 
$addName=''
!$addData - значение 
$addData=''
separPozData=0

!убираем колонку id
!separPozCol = INSTR($add_text0,$Separ)
!$add_text0=$MID($add_text0,separPozCol+1)

!значение id
!separPozData = INSTR($add_text1,$Separ)
	
!i=$TRIM($MID($add_text1,1,separPozData))
!$add_text1=$MID($add_text1,separPozData+1)

:mark_addnew
!'<<$add_text0>>'

separPozCol = INSTR($add_text0,$Separ)

if separPozCol>0:
	!название массива
	$addName=$TRIM($MID($add_text0,1,separPozCol))
	
	$add_text0=$MID($add_text0,separPozCol+1)
	!значение строки
	separPozData = INSTR($add_text1,$Separ)
	$addData=$TRIM($MID($add_text1,1,separPozData))
	$add_text1=$MID($add_text1,separPozData+1)
	
	!pl '<<$addName>>|<<$addData>>'
	if $addName='RUN':
		if $addData!'':Dynamic('<<$addData>>')
	else
		if $MID($addName,1,1)='$':
			!pl '<<$addName>>=$str(<<$addData>>)'
			Dynamic('<<$addName>>=''<<$addData>>''')
		else
			!pl '<<$addName>>=<<VAL($addData)>>'
			Dynamic('<<$addName>>=<<VAL($addData)>>')
		end
	end

	if LEN($add_text0)>0: JUMP'mark_addnew'
else	
	!последняя колонка с кодом
	$addName=$add_text0
	$add_text0=$TRIM($add_text0)
	if LEN($add_text0)>0:Dynamic($add_text0)
	
	$add_text0=''
	
	$add_text1=$TRIM($add_text1)
	if LEN($add_text1)>0:Dynamic($add_text1)
	
	$add_text1=''	
end

в таблицу добавим:

первую строку с описанием массивов для каждой колонки
первую колонку с текстом “gs ‘add’,’”
последнюю колонку с текстом “‘’” (две одинарные кавычки)
в ячейку А1 добавим текст “$col=‘”

Должно получиться

gs ‘add’,$col,’ 0 Мяч предмет i=w 10 0
gs ‘add’,$col,’ 1 Меч оружие i=w 1000 100
gs ‘add’,$col,’ 2 Стакан предмет i=w 5 0
gs ‘add’,$col,’ 3 Хлеб еда i=w 20 -10 brod=i ’
gs ‘add’,$col,’ 4 ёж животное i=w 10 0
gs ‘add’,$col,’ 5 Ледоруб оружие i=w 100 50

Создаем локацию ‘genItems’ и копипастим в нее таблицу, добавляем вызов gs ‘genItems’ сохраняемся, запускаем и получаем заполненные массивы.
теперь достаточно знать id предмета, чтобы получить по нему внесенную информацию

'схватить <<$item[brod]>> по цене <<item_price[brod]>>

При “импорте” есть возможность выполнять код, который можно добавить в колонку ‘RUN’ или добавить в последней колонке.
Код довольно чувствителен к лишним пробелам. Ограничение на общую длину строки около 3620.
Файлик с примером приложил.
ExapleBase.qsp
Код писал лично, при использовании в своих проектах настаиваю на сохранении авторства.
Это мой первый пост, прошу не судить строго.

USER:

Jorge

Edited at 25.05.2023 05:59 (2 years ago)
Aleks Versus Moderator 31.05.2023 11:39 (2 years ago)

Jorge,
не совсем понял. Или понял, но не совсем.
Ты склеиваешь в экселевской таблице данные из таблицы в виде строк и получаешь на выходе валидный код QSP.
Затем этот валидный код вставляешь на локации, и с помощью своего модуля распарсиваешь строку с данными, чтобы получить таблицу данных в QSP?

Похвально. Все рано или поздно приходят к таблицам данных. :)
Вот я, например:
http://aleksversus.narod.ru/index/pravilnyj_sposob_khranenija_dannykh/0-21
Сейчас перерабатываю видео по примитивной системе объектов, где подобная таблица данных играет ключевую роль.
https://youtu.be/O5mnzI7mPV4

Кстати, очень советую познакомиться с модулем Олегуса. Натолкнёт на парочку идей по развитию модуля.
https://qsp.org/forum/120-modul-dla-raboty-s-tablicami-dannyh

Log in or Register to post comments.