Página 1 de 1

TextFile.ReadToTable con 3 valores

Publicado: 03 Dic 2014 03:06
por alete_loza
Hola gente,necesito su ayuda; verán tengo el siguiente código
Diseñé un proyecto para crear (o que se seleccione), un canal favorito y este agregarlo a un nuevo ListBoxEx; ya cuento con 2 ListBoxEx en el cual en uno de ellos ya están cargado todos los canales e iconos correspondientes a cada canal; y un botoncito en el medio de ambos ListBoxEx que este es el encargado de copiar la selección hacia el otro listBox y a su vez guardar la selección en un TXT. (bueno no la hago larga porque acá no tengo el problema)

Este es mi código para leer los valores almacenados en el TXT
--LEE EL ARCHIVO Y EL CONTENIDO INTERNO DE EL .TXT
tFruits = TextFile.ReadToTable("AutoPlay\\Docs\\Datos.txt");
for index,fruit in pairs (tFruits) do
	--CARGA EL CONTENIDO Y OBSERVA SI TIENE EL STRING "|"
	nPipePos = String.Find(fruit, "|", 1, false);
	sItemData = String.Mid(fruit, nPipePos+1, -1);
	sItemText =  String.Left(fruit, nPipePos-1);
	--CARGA LOS DATOS TXT AL LIXBOXEX
	nIndex = ListBoxEx.AddItem("Plugin2", sItemText, sIconoURL, sItemData, "", 1, LBXITEM_HTML, 0, Color, Fondo, Color);
	ListBoxEx.SetItemVisible("Plugin2", nIndex, true);
end
Y en el TXT tengo lo siguiente:
Canal Channel 1|http://localhost/TEST/canales/Argentina/America24.php

Ahora acá voy a hacer la pregunta: Estoy guardando una tercera variable y su separador es un "&" (ampersand), este está situado luego de la extensión *.php quedándome así:
Canal Channel 1|http://localhost/TEST/canales/Argentina ... s\\A24.ico

Y al código que realice anteriormente de la lectura, le agregue unas lineas mas:
nPos = String.Find(fruit, "&", 1, false);
sIconoURL = String.Mid(fruit, nPos+1, -1);
Acá todo tranqui, salió bien los resultados; pero.... la variable "sItemData" desde entonces me sale desde el separador "|" en adelante (incluyendo también el separador "&" del icono.

PREGUNTA: ¿Como puedo hacer para que lea desde el inicio del separador (la primera q es el "|" hasta el segundo separador que es el "&")

Publicado: 03 Dic 2014 05:08
por Dow Sher
Simplemente realiza la búsqueda de "&" y has el mismo proceso que con "|"...
nText = "Canal Channel 1|http://localhost/TEST/canales/Argentina/America24.php&AutoPlay\\Icons\\A24.ico"
nPos = String.Find(nText, "|", 1, false);
sPos = String.Find(nText, "&", 1, false);

Channel = String.Mid(nText, 1, nPos-1);
URL = String.Mid(nText, nPos+1, sPos-1);
Icon = String.Mid(nText, sPos+1, -1);

Input.SetText("Channel", Channel);
Input.SetText("URL", URL);
Input.SetText("Icon", Icon);
Imagen
Como puedes ver no es difícil, solo es cuestión de saber acomodar el código. Espero haber podido ayudarte.

Suerte con tu proyecto.
Saludos Dow Sher :friends:

Re:

Publicado: 13 Dic 2014 04:43
por alete_loza
dowsher escribió:Simplemente realiza la búsqueda de "&" y has el mismo proceso que con "|"...
nText = "Canal Channel 1|http://localhost/TEST/canales/Argentina/America24.php&AutoPlay\\Icons\\A24.ico"
nPos = String.Find(nText, "|", 1, false);
sPos = String.Find(nText, "&", 1, false);

Channel = String.Mid(nText, 1, nPos-1);
URL = String.Mid(nText, nPos+1, sPos-1);
Icon = String.Mid(nText, sPos+1, -1);

Input.SetText("Channel", Channel);
Input.SetText("URL", URL);
Input.SetText("Icon", Icon);
Imagen
Como puedes ver no es difícil, solo es cuestión de saber acomodar el código. Espero haber podido ayudarte.

Suerte con tu proyecto.
Saludos Dow Sher :friends:
Joder y no me llegó la notificación de nueva respuesta, perdon amigo (seguro le erré al chekbox para q me avise via mail de nuevas respuestas) jajajajajajajaja
Implementaré tu codigo; es lo unico q me faltaba xq cosas nuevas se me surgen en la mente y lo implemento en mi proyecto (que está dando frutos)
:yeah: :yeah: :yeah: Gracias!!! :num1: :ohyeah: :friends:

Re:

Publicado: 15 Dic 2014 01:55
por alete_loza
dowsher escribió:Simplemente realiza la búsqueda de "&" y has el mismo proceso que con "|"...
Imagen
Como puedes ver no es difícil, solo es cuestión de saber acomodar el código. Espero haber podido ayudarte.

Suerte con tu proyecto.
Saludos Dow Sher :friends:
Dowsher puse eso y anduvo, pero bueno las necesidades de cargar infinidades de datos del txt por linea (datos del item) le agregué otro dato mas al txt, utilicé el mismo código y le agregue 2 lineas mas (una q determina la existencia del String (en este caso fue del #(numeral), quedándome ordenado en el TXT: Canal#Categoría&Icono|URL_del_canal
Lo cual "canal" y "URL_del_canal" se visualizaron correctamente; pero al poner (acá te dejo el código completo):
nText = "Canal América 24#Canal de Noticias&AutoPlay\\Icons\\A24.ico|http://localhost/TEST/TvSinCable/canales/Argentina/America24.php";
nPos1 = String.Find(nText, "#", 1, false);
nPos2 = String.Find(nText, "&", 1, false);
nPos3 = String.Find(nText, "|", 1, false);

Channel = String.Mid(nText, 1, nPos1-1);

Categoria = String.Mid(nText, nPos1+1, nPos2-1);--**
Icon = String.Mid(nText, nPos2+1, nPos3-1);--**

URL = String.Mid(nText, nPos3+1, -1);

Input.SetText("Input1", Channel);--listo
Input.SetText("Input2", Categoria);
Input.SetText("Input3", Icon);
Input.SetText("Input4", URL);--listo
en el Input2 sale esto:
Imagen
Es decir que hace caso a donde debe iniciar, pero no a donde debe terminar, y solo agregué 1 linea mas (una q busca el string, y la otra la de desde/hasta donde debe leer.

y es confuso porque utilicé el mismo código q me enseñaste

Publicado: 15 Dic 2014 05:43
por Dow Sher
Hola alete_loza!!

Veras el problema es muy simple, lo que pasa es que no comprendes como funciona el código.

String.Mid(String, Comienzo, Fin);

En el código anterior Comienzo se refiere al numero de localización del caracter donde se comenzara a crear el nuevo String, Fin se refiere al numero de caracteres que se utilizaran después del caracter de Comienzo.

Explicación:
nText = "Hola mundo";
sText = String.Mid(nText, 6, 5);

-- Lo anterior devuelve lo siguiente...
sText = "mundo";

-- Donde el numero 6 corresponde a la "m" del string nText y el numero 5 corresponde a los siguientes 5 caracteres después de la "m"
No se si me dí a entender.

Por lo tanto el código que debes de usar es así...
nText = "Canal América 24#Canal de Noticias&AutoPlay\\Icons\\A24.ico|http://localhost/TEST/TvSinCable/canales/Argentina/America24.php";

nPos1 = String.Find(nText, "#", 1, false);
nPos2 = String.Find(nText, "&", 1, false);
nPos3 = String.Find(nText, "|", 1, false);

Channel = String.Mid(nText, 1, nPos1-1);
Categoria = String.Mid(nText, nPos1+1, nPos2-(nPos1+1));
Icon = String.Mid(nText, (nPos2+1), nPos3-(nPos2+1));
URL = String.Mid(nText, nPos3, -1);

Input.SetText("Input1", Channel);
Input.SetText("Input2", Categoria);
Input.SetText("Input3", Icon);
Input.SetText("Input4", URL);
Si tienes dudas pregunta, recuerda "Cuando se quiere entender una cosa, lo mejor que se puede hacer es preguntar".
Saludos Dow Sher :friends:

Publicado: 15 Dic 2014 14:59
por Pabloko
Imagen

Utiliza esta funcion mejor
function DelimitedToTable(s, d)
        if not d or #d < 1 then return nil end
        local tbl = {};
        local sa = s;
        local sD = "";
        local nP = string.find(sa, d, 1, true)
        while nP do
                sD = string.sub(sa, 1, nP-1)
                table.insert(tbl, #tbl+1, sD)
                sa = string.sub(sa, nP+1, -1)
                nP = string.find(sa, d, 1, true)
        end
        if sa ~= "" then table.insert(tbl, #tbl+1, sa) end
        return tbl;
end
por ejemplo

Código: Seleccionar todo

tabla=DelimitedToTable("caca|pedo|pis","|")
--tabla[0] = caca
--tabla[1] = pedo
--tabla[3] = pis
k?

Publicado: 15 Dic 2014 20:02
por Dow Sher
Pabloko es un genio Imagen
Nunca se me habría ocurrido hacer esa function :num1:

Re:

Publicado: 17 Dic 2014 05:47
por alete_loza
dowsher escribió:Hola alete_loza!!
Por lo tanto el código que debes de usar es así...
nText = "Canal América 24#Canal de Noticias&AutoPlay\\Icons\\A24.ico|http://localhost/TEST/TvSinCable/canales/Argentina/America24.php";

nPos1 = String.Find(nText, "#", 1, false);
nPos2 = String.Find(nText, "&", 1, false);
nPos3 = String.Find(nText, "|", 1, false);

Channel = String.Mid(nText, 1, nPos1-1);
Categoria = String.Mid(nText, nPos1+1, nPos2-(nPos1+1));
Icon = String.Mid(nText, (nPos2+1), nPos3-(nPos2+1));
URL = String.Mid(nText, nPos3, -1);

Input.SetText("Input1", Channel);
Input.SetText("Input2", Categoria);
Input.SetText("Input3", Icon);
Input.SetText("Input4", URL);
Si tienes dudas pregunta, recuerda "Cuando se quiere entender una cosa, lo mejor que se puede hacer es preguntar".
Saludos Dow Sher :friends:
Dowsher porque me devuelve el valor "1" el icono???, lo estoy utilizando con la table q habia puesto al principio del post, y me devuelve "1" y si no es sin tabla, me devuelve la url del icono (q ahi anda bien)

On Show:
--LEE EL ARCHIVO Y EL CONTENIDO INTERNO DE EL .TXT
tFruits = TextFile.ReadToTable("AutoPlay\\Docs\\Datos.txt");
for index,fruit in pairs (tFruits) do
	--/CARGAMOS EL CONTENIDO Y VERIFICAMOS SI TIENEN LOS STRINGS/--
	nPos_1 = String.Find(fruit, "#", 1, false);
	nPos_2 = String.Find(fruit, "&", 1, false);
	nPos_3 = String.Find(fruit, "|", 1, false);
	--/CARGAMOS EL NOMBRE DEL CANAL/--
	sCANAL = String.Mid(fruit, 1, nPos_1-1);
	--/CARGAMOS LA CATEGORIA DEL CANAL/--
	sCATEGORIA = String.Mid(fruit, nPos_1+1, nPos_2-(nPos_1+1));
	--/CARGAMOS EL ICONO DEL CANAL/--
	sICONO = String.Mid(fruit, nPos_2+1, nPos_3-(nPos_2+1));
	--/CARGAMOS LA URL DEL CANAL/--
	sURL = String.Mid(fruit, nPos_3+1, -1);

--/CREAMOS LISTA DE LOS ICONOS QUE SE IRAN GENERANDO/--
cImageList = ListBoxEx.CreateImageList("Plugin2", 32, BIT_32);
	if (cImageList) then
		lIcon = ListBoxEx.AddIcon("Plugin2", sICONO);
	end
	--CARGA LOS DATOS TXT AL LIXBOXEX
	
	ListBoxEx.AddItem("Plugin2", sCANAL..sCATEGORIA, "", sURL, "", lIcon, LBXITEM_HTML, 0, Color, Fondo, Color);
end
Probé para ver que es lo q me devuelve el lIcon cargandolo en un Label. y este me arroja que le llega el valor 1 :hypno: :hypno:

Publicado: 17 Dic 2014 09:02
por Dow Sher
El problema: Exactamente el mismo que la vez pasada, :sorry: no comprendes como funciona el código.

Te invito a leer la ayuda de ListBoxEx, pero no solo a leer sino que a comprender lo que estas leyendo.
ListBoxEx.AddIcon en la ayuda de ListBoxEx biene un ejemplo de como usar este script de acción, sin embargo viene con otro script de acción que es ListBoxEx.CreateImageList. Si leemos la ayuda de LisBoxEx en la parte que explica como funciona este último script de acción nos damos cuenta de lo siguiente:
Imagen
Nota escribió:Ésta acción solo la puede llamarse una vez.
Imagen
Ese es su error alete_loza, en el Script que dejo en su comentario se puede ver que llama la acción ListBoxEx.CreateImageList más de una vez (o claro que si en el TXT solo hay una linea de texto). Por lo anterior le he creado un nuevo Script:
CANAL = { };
CATEGORIA = { };
ICONO = { };
URL = { };
 Delimiters = { "#", "&", "|" };
  TablesNames = { CANAL, CATEGORIA, ICONO, URL };


tFruits = TextFile.ReadToTable("AutoPlay\\Docs\\Doc.txt");
 for index, fruit in pairs (tFruits) do
  for Delimiter = 1, #Delimiters do
   nPos = String.Find(fruit, Delimiters[Delimiter]);
    nText = String.Mid(fruit, 1, nPos-1);
     Table.Insert(TablesNames[Delimiter], (Table.Count(TablesNames[Delimiter]))+1, nText);
    fruit = String.Mid(fruit, nPos+1, -1);
  end
    Table.Insert(TablesNames[4], (Table.Count(TablesNames[4]))+1, fruit);
 end

cImageList = ListBoxEx.CreateImageList("Plugin1", 32, BIT_32);
 if (cImageList) then
  for x = 1, #ICONO do
   ListBoxEx.AddIcon("Plugin1", ICONO[x]);
  end
 end

for x = 1, #CANAL do
 ListBoxEx.AddItem("Plugin1", CANAL[x].."  "..CATEGORIA[x], "", URL[x], "", x, LBXITEM_HTML, 0, Color, Fondo, Color);
end
Espero haber podido ayudarle
Saludos Dow Sher :friends:

Re:

Publicado: 18 Dic 2014 05:00
por alete_loza
dowsher escribió:Espero haber podido ayudarle
Saludos Dow Sher :friends:
dowsher en la linea 33 le haz errado a una variable.
Haz puesto:
ListBoxEx.AddItem("Plugin1", CANAL[x].."  "..CATEGORIA[x], "", URL[x], "", lIcon, LBXITEM_HTML, 0, Color, Fondo, Color);
Cuando en realidad el "lIcon" ya no existía mas :)

Así que lo arreglé:
ListBoxEx.AddItem("Plugin1", CANAL[x].."  "..CATEGORIA[x], "", URL[x], "", ICONO[x], LBXITEM_HTML, 0, Color, Fondo, Color);
Como siempre, probé para ver si la url del icono llegaba bien (con un Label.SetText) y efectivamente llega tal cual se lo ha guardado, pero... ICONO[x]

ListBoxEx.AddItem("Plugin1", CANAL[x].." "..CATEGORIA[x], "", URL[x], "", ICONO[x], LBXITEM_HTML, 0, Color, Fondo, Color);


No lo carga, lei la ayuda (que lamentablemente en mi ams no tengo la ayuda (*.chm) del ListBoxEx, asi q me guié por el que haz puesto tú; de eso que solo la lista de iconos que debía llamarse solo una vez (claro si en el TXT solo existía una linea; pero existen mas de una linea).

Cualquier cosa me avisas y te paso la apz llamada "favoritos", porque es un apartado para que el usuario pueda tener la posibilidad de agregar el canal que le interesa y guardarlo para su futura visualizacion en el programa.

Publicado: 18 Dic 2014 05:17
por Dow Sher
:) jajajaja bueno en realidad alete_loza en donde he metido la pata no va ni lIcon ni ICONO[x] sino que simplemente va x. Script modificado.

Publicado: 18 Dic 2014 18:53
por alete_loza
La pifiamos ambos :) :)Y con esto digo.... GRACIAS!!! :closed: :closed:

Publicado: 18 Dic 2014 19:03
por Dow Sher
:num1: De nada, para eso estamos para ayudar
:friends: