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;
}