Foros del Web » Creando para Internet » Flash y Actionscript »

Leer txt desde AS

Estas en el tema de Leer txt desde AS en el foro de Flash y Actionscript en Foros del Web. Hola a [email protected] no sé si se puede hacer lo siguiente Desde un txt (tiene 1000 lineas), con la estructura Linea 1 Linea 2 Linea ...
  #1 (permalink)  
Antiguo 26/06/2006, 20:54
 
Fecha de Ingreso: diciembre-2005
Mensajes: 8
Antigüedad: 12 años
Puntos: 0
Pregunta Leer txt desde AS

Hola a [email protected] no sé si se puede hacer lo siguiente

Desde un txt (tiene 1000 lineas), con la estructura

Linea 1
Linea 2
Linea 3
Linea 4
....

Y con la ayuda de Ramdom el script tiene que recoger una linea entera aleatoriamente.

Mi pregunta es, evidentemente como se prodría hacer eso y también calcular el número de lineas que hay en el txt (por si en un futuro cambia).

Se hacerlo en php y JS pero en AS ni idea

Espero sus repuestas y 1000 gracias (como el txt).
  #2 (permalink)  
Antiguo 26/06/2006, 22:29
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 11 años, 11 meses
Puntos: 5
Buenas, empecé haciendo un par de pruebas y al final me entusiasmé y escribí un poco más de lo que tenía pensado inicialmente.

Primero, lo que te conviene usar es el objeto LoadVars. Por lo general, se usa el evento onLoad, que "parsea" los datos como variables. Pero, en este caso, tenés que acceder a los datos "en crudo", para lo cual usás el evento onData.

La líneas las podés detectar a partir del caracter de salto de línea ("\n"). Se me ocurrieron dos formas de hacer lo que buscás:

La primera es empezar a leer el archivo e ir concatenando caracter por caracter hasta encontrar un salto de línea. Cuando lo encontrás todo el string que concatenaste lo guardás como un elemento de un array, y volvés a hacer lo mismo hasta encontrar el siguiente salto (y así hasta el final del archivo). La ventaja de esto es que ya vas a tener todo el txt mapeado en un array y es un poco más cómodo para trabajar (al menos para mi gusto). Después podrías sacar cualquier línea al azar (o sin azar) sin mayor procesamiento.

Pero, siempre va a ser más lento que la segunda manera que se me ocurrió que es leer todo el archivo y guardar en un array sólo los índices "de corte". O sea, algo que te indique dónde empieza y dónde termina la línea 3, por ejemplo. Con eso, sólo te queda hacer un substring sobre el string que tiene el contenido del txt para encontrar una línea determinada.

Si vas a buscar líneas varias veces sobre el mismo archivo, te convendría guardar el string con todo el archivo en bruto (variable src), y los arrays arrIndices[] y arrLineas[] como variables globales (yo las puse locales). Así, te evitás hacer todo el proceso de recorrer el archivo (lo que puede llevar bastante tiempo y recursos, si el archivo es grande) cuando no es realmente necesario.

Bueno, acá va lo que escribí. Espero que te dé algunas ideas.

Suerte
Califa

Archivo test.txt

Código:
Linea 1 lalalla
linea 2 asfddsfs
línea3 dsfdsfdsf
línea4 dsfdsafdsfasf
Código AS:

Código:
System.useCodepage = true; // a menos que grabes el .txt como utf-8; en ese caso, va false
var datos_lv = new LoadVars();
var bMapearArrayTxt = true; // si está en true mapear todo el txt a un array

datos_lv.onData = function (src) {
	if (src != undefined) {
		procesarTxt(src);
	} else {
		trace("error de carga");
	}
}
datos_lv.load("test.txt");

function procesarTxt(src) {
	lineaAleatoria = getLinea(src);
	trace("lineaAleatoria="+lineaAleatoria);

	if (bMapearArrayTxt == true) {
		lineaAleatoria_b = getLineaArray(src);
		trace("lineaAleatoria, método con arrays="+lineaAleatoria_b);
	}
}
/**
Buscando sólo los saltos de línea, sin mapear todo el txt a un array
*/
function getLinea(src) {
	var arrIndices = buscarIndices(src);
	var cantLineas = arrIndices.length -1; // el array tiene 1 más que el total de líneas
	var rnd = random(cantLineas);
	var indiceInicial = arrIndices[rnd]; // tomar el índice inferior del arrIndices
	var indiceFinal = arrIndices[rnd+1]; // tomar el índice superior del arrIndices
	var lineaAleatoria = src.substring(indiceInicial,indiceFinal); // tomar el substring dentro de los índices anteriores 
	return lineaAleatoria;
}

function buscarIndices(input) {
	var cantChars = input.length;
	var i;
	var arrIndicesSaltos = [0]; // el primer índice siempre va a ser 0
	for (i=0;i<cantChars;i++) {
		if(input.charAt(i) == "\n") {
			arrIndicesSaltos.push(i+1); // tomar la posición siguiente al salto de línea
		}
		if (i == (cantChars - 1) ){
			arrIndicesSaltos.push(i); // agregar un índice para el fin del archivo
		}
	}
	return arrIndicesSaltos;
}
/**
Mapeando todo el txt en un array
*/
function getLineaArray(src) {
	var arrLineas = mapearTxtArray(src); // mapear las líneas en un array
	var cantLineas = arrLineas.length;
	var rnd = random(cantLineas);
	var strLinea = arrLineas[rnd]; // obtener el elemento según un número aleatorio
	return strLinea;
}

function mapearTxtArray(input) {
	var cantChars = input.length;
	var i;
	var arrLineas = [];
	var strLinea = "";
	for (i=0;i<cantChars;i++) {
		if (input.charAt(i) == "\n") {
			arrLineas.push(strLinea);
			strLinea = "";
		} else {
			strLinea += input.charAt(i);
		}
	}
	arrLineas.push(strLinea);
	return arrLineas;
}

Última edición por califa010; 26/06/2006 a las 23:59
  #3 (permalink)  
Antiguo 27/06/2006, 17:53
 
Fecha de Ingreso: diciembre-2005
Mensajes: 8
Antigüedad: 12 años
Puntos: 0
Gracias tio eres Dios, era justo lo k necesitaba.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:46.