Anuncios Google

Ayuda: Almacenar tabla en archivo TXT [LUADev][Solucionado]

Pues bien el otro día me preguntaba como almacenar una tabla de este tipo en un archivo.txt:

tabla={x=23,y=12}

Y la verdad no se me ocurre ninguna forma aparte de almacenarlos dato por dato:

ini.write("archivo.txt","1",tabla.x)

 

Alguien sabe otra forma??

Salu2 y gracias


Risa Dos años en SCENEBETA Risa

Click aquí para ver la Entrada de Bitácora.


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Chimecho

Mini Tuto sacado de debajo de la manga - by Chimecho

Lo que podrías hacer es una función que te vaya escribiendo el contenido de la tabla, si lo entendí bien lo que quieres es guardar cualquier tabla, de cualquier tamaño y con cualquier índice en un archivo para luego hacer dofile al archivo y tener la tabla cargada.

Pues, para esto, tendrías que usar una función iteradora (como ipairs), otra para ver el tipo tanto de la "clave" y del "valor" (hablo de type) y el resto de funciones que necesites para grabar en un archivo (io, ini, etc...)

Lo primero es definir cómo lo vas a guardar, luego construir el texto, y por último guardar el texto.

Como quieres poder cargar la tabla con dofile, deberás tener texto que lua reconozca como código, y que puedas adaptar a todo tipo de par (clave,valor) ejemplo:

tabla = {}
tabla["x"] = 23 -- esto es lo mismo que tabla.x = 23
tabla["y"] = 12 -- esto es lo mismo que tabla.y = 12
tabla[1] = "bla"
tabla[2] = "ble"
.
.
.
.
-- etcétera

Ok, entonces lo primero que necesitas, es el nombre con el que se va a guardar la tabla, y la tabla en sí, para eso, creas una función que reciba dos parámetros:

function tabla2string(nombre, tabla)
	local str = nombre.." = {}\n" -- esto quedará en el archivo como "tabla = {}" y un enter
	str = str .. pares2string(nombre, tabla) -- esta función recorrerá la tabla, y guardará los pares (clave, valor) con el formato de "tabla[clave] = valor\n"
	return str -- retornas la tabla como texto con un formato válido para ser leído como código lua
end

Bien, hasta ahí está sólo declarada una tabla vacía, ahora, para guardar los valores, hay que implementar pares2string:

function pares2string(nombre, tabla)
	local texto = "" -- defines un texto vacío para luego ir agregando los datos
 
	for clave, valor in ipairs(tabla) do -- recorre todos los campos de la tabla
		texto = texto .. nombre .. "[" -- primero se guarda el nombre y un [, queda "tabla["
 
		-- aquí la clave puede ser o number, o string (hasta donde sé), para guardarlos de forma correcta (si es número, tal cual, si es string, con las comillas)
		texto = texto .. valor2luacode(clave) .. "] = " -- esto lo que hace es agregar la clave, con lo que va quedando 'tabla["x"] = ' en caso de ser string, o 'tabla[1] = ' en caso de ser number
 
		-- y luego añadimos el valor correspondiente a esa clave
		texto = texto .. valor2luacode(valor) .. "\n" -- con esto ya queda 'tabla["x"] = 23' ó 'tabla[1] = "bla"' dependiendo de los tipos, más un enter para dar paso a la siguiente línea
	end -- fin del for
 
	return texto -- retornas el texto con los valores de la tabla
end
 
function valor2luacode(valor)
	if type(valor)=="string" then -- si es un string
		return "\"" .. valor .. "\"" -- pone entre comillas el valor, o también se puede poner return '"' .. valor .. '"'
	elseif type(valor)=="number" then -- si es un número
		return valor -- que lo regrese tal cual
	else -- en caso de no ser ninguno
		return "vacio" -- para que no de error, retorna "vacio", esto sirve tanto como clave o como valor de la tabla
	end -- fin del if
end

Y con eso creo que ya está, sólo queda usar la función de tabla2string y
guardar el resultado que de pruébalo que no tengo el psp a la mano.

No pongo el "código final" para que tengan que leer todo en lugar de copiar y pegar, la gracia es que se entienda todo :)

Saludos!



PSP FAT [5.00 M33-6] [6.60 ME] [Hard Moded] / Nintendo Wii [4.1U] [cIOS Hermes] [D2X cIOS] / iPhone 3G [4.2.1] [BB 05.13.04] [redsn0w] / iPod Touch 4 [6.1] [evasi0n]

07/05/10: Tuve el placer de llamarle con todo derecho "N00B" a molotovi xDDD

Recuerda: Sé el intérprete -_-

Imagen de jorge_97

By Jorge_97

Bueno muchisimas gracias por tu comentario...

Me las he apañado de otro modo no "tan largo y complicado":

function guardar()
archivo=io.open("archivo.txt","w+")
 
for i=1,10 do
archivo:write("di["..i.."]={t1={x="..di[i].t1.x..",y="..di[i].t1.y..",t="..di[i].t1.t..",c="..di[i].t1.c..",o=color.new("..color.R(di[i].t1.o)..","..color.G(di[i].t1.o)..","..color.B(di[i].t1.o)"),f="..di[i].t1.f.."}\n")
end
archivo:flush()
archivo:close()
os.message("Guardado con éxito")
end


El problema que tengo es que me he dado cuenta que no se PUEDEN almacenar colores en archivos de texto. Sorprendente pero cierto.

Es decir:

rojo=color.new(255,0,0)

si almacenas eso en un txt almacena un número...

Alguien sabe como solucionar eso??

 

Un saludo a todos y muchas gracias


Risa Dos años en SCENEBETA Risa

Click aquí para ver la Entrada de Bitácora.

Imagen de NEKERAFA

O.O

Osea, lo que te estaba diciendo... aíns, es que no atendeis jajajaja

Imagen de jorge_97

by jorge_97

lol

Aunque el mini tuto de Chime

Aunque el mini tuto de Chime esta excelente, me alegra que encontraras la forma de solucionarlo.

Imagen de jorge_97

By Jorge_97

Jajjaja si prefiero encontrar la solucion simpre por mí mismo pero como hasta ese momento no lo encontraba pues dije me paso por "El consejo de sabios"

Salu2


Risa Dos años en SCENEBETA Risa

Click aquí para ver la Entrada de Bitácora.

Claro, en verdad un color es

Claro, en verdad un color es un número, por ejemplo lo que sería color.new(255,0,0) en verdad lo que devuelve es el número 0xFF0000 hexadecimal.

Imagen de jorge_97

By Jorge_97

Si exactamente ;)

Eso fue lo que pensé el problema es debo usar ese color después por lo tanto como lo transformo a RGB??

Salu2 Xerpi


Risa Dos años en SCENEBETA Risa

Click aquí para ver la Entrada de Bitácora.

Imagen de Chimecho

Como dice xerpi

Es válido igual, pero por si quieres lee la docu, en el módulo color está cómo obtener las 4 componentes con 4 funciones.

Saludos!



PSP FAT [5.00 M33-6] [6.60 ME] [Hard Moded] / Nintendo Wii [4.1U] [cIOS Hermes] [D2X cIOS] / iPhone 3G [4.2.1] [BB 05.13.04] [redsn0w] / iPod Touch 4 [6.1] [evasi0n]

07/05/10: Tuve el placer de llamarle con todo derecho "N00B" a molotovi xDDD

Recuerda: Sé el intérprete -_-

Imagen de jorge_97

by jorge_97

Si solo necesitaba añadir 0x

Por ejemplo rojo=ff0000

Para ponerlo en un print=0xff0000

Salu3

No hace falta, si haces: rojo

No hace falta, si haces: rojo = 0xFF0000 será válido igual. No debes preocuparte por eso dejalo tal y cual está, funcionara perfectamente. Ya verás mira esto: http://www.javascripter.net/faq/rgbtohex.htm

Imagen de jorge_97

By Jorge_97

Muchas gracias ;)

Ahora sí está todo perfecto... se quedará genial mi proyecto ajjaja

Salu2

Perdona pero si como bien

Perdona pero si como bien dices manejas bien el modulo IO por que creastes el notepad, entonces puedes escribir la tabla en un txt, ya que es lo mismo. Primero decide que quieres escribir, solo valores o campos y valores. Segundo decide si lo quieres con el modulo INI o IO. Tercero codealo, entiendo que lo unico que te falla es la planificacion, dado a la informacion poco clara que proporcionas. Mi consejo repasa el seudocodigo y luego si necesitas ayuda exponlo aqui y te ayudamos, ya que el seudocodigo es la base de un buen code

Imagen de NEKERAFA

Mmm...

Lo mejor es utilizar el modulo io, que permite leer y escribir archivos, sean txt o ini o gif... Aquí tienes la documentación oficial, también funciona en LuaDEV (Es uno de los módulos generales)


NekeOS, el nuevo shell para PSP

PS4 500GB OFW, PS3 320GB OFW, PS3 500GB OFW, PSP 6.39 PRO-C Fix4.

Sony Xperia Z1 Compact con Android 5.1.1

Portatil Lenovo z50-70 Intel® Core™ i7-4510U y NVIDIA GeForce 840M con Elementary OS 0.3.2 Freya (64 bits) y Windows 10 (64 bits).

Imagen de jorge_97

By Jorge_97

Si lo sé... si no como crees que hice NotepadCode ¬¬

Lo que no sé es almacenar la tabla

 

Imagen de NEKERAFA

Entonces

¿Que problema tienes? Es solo guardar la tabla como si fuera un texto normal

Imagen de jorge_97

by jorge_97

La tabla debo usarla despúes... ese es el problema

Salu2

Imagen de NEKERAFA

XD

Un dofile y a correr

Imagen de jorge_97

By Jorge_97

si lees más abajo lo verás que lo que quería era después sobre el archivo almacenadao hacerle un dofile..

Salu2

Imagen de NEKERAFA

Mmm...

¿Entonces? Solo tienes que unir las dos cosas

Imagen de Dioni0396

Porque no haces una funcion

y te ahorras tiempo?:

function GuardarTabla(tabla)
ini.write("archivo.txt","1",tabla.x)
ini.write("archivo.txt","1",tabla.y)
ini.write("archivo.txt","1",tabla.h)
ini.write("archivo.txt","1",tabla.w)
end
--No crees que te ahorraria trabajo y esfuerzo haciendolo asi?
--PD: Para este codigo necesitas siempre el ancho,alto,x e y en la tabla sino saltara error de que faltan argumentos

Cómo quieres almacenarla?

Cómo quieres almacenarla? sólo los valores de la tabla, o quieres ponerles rótulos, o tal cual lo escribiste (sintaxis y todo)?

Imagen de jorge_97

By Jorge_97

Estaría fenomenal almacenarla tal cual para poder usar después un dofile...

Dioni ese método lo sabía ya... lo puse arriba para que no respondieran con eso.

Pero de todos modos gracias.

 


Risa Dos años en SCENEBETA Risa

Click aquí para ver la Entrada de Bitácora.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.