• Lunes 18 de Noviembre de 2024, 00:47

Autor Tema:  Ordenar strings en un archivo texto  (Leído 8661 veces)

U2_Caparzo

  • Miembro activo
  • **
  • Mensajes: 45
  • Nacionalidad: cl
  • Super duper divertido xDD
    • Ver Perfil
Ordenar strings en un archivo texto
« en: Domingo 11 de Marzo de 2012, 22:44 »
0
Hola a todos, primero que nada, me presento, soy rodrigo cordova, uso el nick de U2_Caparzo, actualmente soy estudiante de 17 años(estoy en mi ultimo año del liceo) y uno de mis intereses es continuar como estudiante de ingenieria informatica.
Paso bastante tiempo, editando un servidor de un juego(conquer), los cuales todos estan escritos en C#. Vine a este foro, porque en el foro que participaba en desarrollo de estos servidores, no hay nadie que tenga grandes conocimientos, de hecho yo escribi algo basico para que algunos aprendieran de C#.

Bueno ahora al grano.

El otro dia, estuve tratando de ordenar un archivo de texto llamado ItemAdd.ini
el archivo solo son numeros por ejemplo

123510 12 4214 32141 421421 4213 5436 534 12

los 2 primeros numeros son los que estoy tratando de ordenar, o sea que a partir de esos trato de ordeanr el archivo

el primer numero se repite siempre 12 veces
por ejemplo
123510 1 ......
123510 2 ......

ahora, estan todos desordenados, asi que lo que hice fue 2 maneras de ordenarlo que es por el primer numero o el segundo numero.

Les proveere el codigo que estoy usando, como estructura generalizada, porque no me encuentro en mi Laptop y no tengo C# aca.

se que obviamente la ineficiencia esta en el uso masivo de ciclos asi que esperaria algo de ayuda con eso.

bueno, lo que hice fue esto

tengo un List<string> llamado IDsque almacenara todas las ID (primer numero) y un byte llamado Maximo plus = 12; (el maximo base del segundo numero)

creo un array de strings de todas las lineas con File.ReadAllLines

luego
foreach(string linea in lineas)//lineas es el array anterior
{
string[] sp = linea.Split(' ');
if(!IDs.Contains(sp[0]))
    IDs.Add(sp[0]);
if(Maximo < byte.Parse(sp[1]))
   Maximo = byte.Parse(sp[1]);
}

entonces aqui viene lo feo, son 3 ciclos en total... por cierto cree un stringbuilder sb

foreach(string ID in IDs)//el List<string> que cree antes
{
    for(byte i = 1; i <= Maximo; i++);
       {
        foreach(string linea in lineas)//del array al leer el archivo
             {
                if(Line.StartsWith(ID + " " + i.ToString() + " ")/*agrego un espacio al final porque el 1 se repetiria en 1, 10, 11, y 12, etc...*/
                         sb.AppendLine(linea);
             }
       }
}

y luego escribo el stringbuilder al archivo con StreamWriter.

lo que pasa es que tarda mucho ademas de que usa bastante memoria, asi que algo de guia con esto se los agradeceria demasiado. he escuchado algo de OrderBy en List<> pero no entendi mucho como usarlo

gracias por adelantado
« última modificación: Domingo 11 de Marzo de 2012, 22:49 por U2_Caparzo »
Lo dificil se hace... lo imposible se intenta
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.(Frase de Albert Einstein)

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re:Ordenar strings en un archivo texto
« Respuesta #1 en: Lunes 12 de Marzo de 2012, 02:14 »
0
Bueno ahora al grano.

El otro dia, estuve tratando de ordenar un archivo de texto llamado ItemAdd.ini
el archivo solo son numeros por ejemplo

123510 12 4214 32141 421421 4213 5436 534 12

los 2 primeros numeros son los que estoy tratando de ordenar, o sea que a partir de esos trato de ordeanr el archivo

el primer numero se repite siempre 12 veces  /*Se repite en la misma linea? o en lineas diferentes?*/
por ejemplo
123510 1 ......
123510 2 ......

ahora, estan todos desordenados, asi que lo que hice fue 2 maneras de ordenarlo que es por el primer numero o el segundo numero.


tengo un List<string> llamado IDsque almacenara todas las ID (primer numero) y un byte llamado Maximo plus = 12; (el maximo base del segundo numero) /* Está parte no la entendí */




Si pudieras poner un ejemplo del archivo que quieres leer y del RESULTADO que quieres obtener me ayudaría un poco más a comprender.... no entendí del todo lo que deseas hacer....

Saludos!
@gabio87

U2_Caparzo

  • Miembro activo
  • **
  • Mensajes: 45
  • Nacionalidad: cl
  • Super duper divertido xDD
    • Ver Perfil
Re:Ordenar strings en un archivo texto
« Respuesta #2 en: Lunes 12 de Marzo de 2012, 02:52 »
0
Si pudieras poner un ejemplo del archivo que quieres leer y del RESULTADO que quieres obtener me ayudaría un poco más a comprender.... no entendí del todo lo que deseas hacer....

Saludos!
es que tocaria subir los 2 archivos pero como dije estoy en otro pc, pero mira

son los 2 primeros numeros los importantes (ID y Plus respectivamente) los otros dan lo mismo.
el archivo por ejemplo es asi
(AGREGARE PUNTOS PARA DECIR QUE LO OTRO NO ES IMPORTANTE Y ASI AHORRO TIEMPO)
supongamos que esta asi pero a una escala mayor...

90 1 .......
84 3 .......
12 2 .......
90 2 .......
84 2 .......
84 1 .......
90 3 .......
12 3 .......
12 2 .......

el resultado que quiero es esto

12 1 .....
12 2 ......
12 3 ......
84 1 .....
84 2 .....
84 3 .....
90 1 .....
90 2 ......
90 3 .....

de la manera que lo hice funciona pero tarda demasiado, uso 3 foreach y un for, y el archivo tiene mas de 2000 lineas, entonces es obvio el porque tarda, el resultado obviamente es el que dije anteriormente pero de una manera mas eficiente

gracias por la ayuda :D
« última modificación: Lunes 12 de Marzo de 2012, 02:56 por U2_Caparzo »
Lo dificil se hace... lo imposible se intenta
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.(Frase de Albert Einstein)

caperutxa

  • Miembro activo
  • **
  • Mensajes: 40
  • Nacionalidad: 00
    • Ver Perfil
Re:Ordenar strings en un archivo texto
« Respuesta #3 en: Lunes 12 de Marzo de 2012, 07:22 »
0
Si bien entiendo quieres ordenar un vector de números de menor a mayor.

Hay muchos métodos documentados. Este es el de burbuja:

http://es.wikipedia.org/wiki/Ordenamiento_de_burbuja

En resumen. Tienes un vector A unidimensional de n posiciones. Coges un elemento j  y compruebas si para j+1 A(j+1)<A(j). En caso positivo intercambias posiciones y continuas. Recorres el vector para cada uno de los elementos i (te aseguras de ordenarlos todos).

for(i=0; <n; i++){
    for(j=0; j<n-1; j++){
          if(A[j]>A[j+1]){
                x = A[j];
                A[j] = A[j+1];
                A[j+1] = x;
           }
     }
}
Si quieres obtener resultados diferentes no hagas siempre lo mismo.


gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re:Ordenar strings en un archivo texto
« Respuesta #4 en: Lunes 12 de Marzo de 2012, 18:23 »
0
Bueno, aquí te paso lo que para mí es la mejor solución.

Tomando en cuenta el ejemplo que me pasaste, cree un archivo "ordenar.txt"  con el siguiente contenido:
90 1 .......
84 3 .......
12 2 .......
90 2 .......
84 2 .......
84 1 .......
90 3 .......
12 3 .......
12 2 .......

entonces procedemos a ordenarlo.. :)

Código: C#
  1.  
  2.             string[] Lineas = System.IO.File.ReadAllLines(Application.StartupPath + "\\ordenar.txt");
  3.          
  4.             IEnumerable<string> ordenar = Lineas.OrderBy(orde => orde);
  5.  
  6.             foreach (string x in ordenar)
  7.             {
  8.                 richTextBox1.Text += x + (char)13;
  9.             }
  10.  

El resultado lo voy almacenando en un richTextBox como puedes observar, en tú caso recorres el vector ordenar y usas el StreamWriter para crear tú archivo. :) ...

Puedes apoyarte leyendo aquí: http://msdn.microsoft.com/es-es/library/bb534852.aspx , yo utilice el OrderBy (http://msdn.microsoft.com/es-es/library/bb534966.aspx)

Saludos espero te sirva.
@gabio87

U2_Caparzo

  • Miembro activo
  • **
  • Mensajes: 45
  • Nacionalidad: cl
  • Super duper divertido xDD
    • Ver Perfil
Re:Ordenar strings en un archivo texto
« Respuesta #5 en: Martes 13 de Marzo de 2012, 02:59 »
0
Bueno, aquí te paso lo que para mí es la mejor solución.

Tomando en cuenta el ejemplo que me pasaste, cree un archivo "ordenar.txt"  con el siguiente contenido:
90 1 .......
84 3 .......
12 2 .......
90 2 .......
84 2 .......
84 1 .......
90 3 .......
12 3 .......
12 2 .......

entonces procedemos a ordenarlo.. :)

Código: C#
  1.  
  2.             string[] Lineas = System.IO.File.ReadAllLines(Application.StartupPath + "\\ordenar.txt");
  3.          
  4.             IEnumerable<string> ordenar = Lineas.OrderBy(orde => orde);
  5.  
  6.             foreach (string x in ordenar)
  7.             {
  8.                 richTextBox1.Text += x + (char)13;
  9.             }
  10.  

El resultado lo voy almacenando en un richTextBox como puedes observar, en tú caso recorres el vector ordenar y usas el StreamWriter para crear tú archivo. :) ...

Puedes apoyarte leyendo aquí: http://msdn.microsoft.com/es-es/library/bb534852.aspx , yo utilice el OrderBy (http://msdn.microsoft.com/es-es/library/bb534966.aspx)

Saludos espero te sirva.

eso debe ser lo que oí, Muchisimas gracias  :jumpie:, el fin de semana quizas te traiga la respuesta, por ahora descargare las paginas que no tengo internet todos los dias  :nosweat:
Lo dificil se hace... lo imposible se intenta
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.(Frase de Albert Einstein)

U2_Caparzo

  • Miembro activo
  • **
  • Mensajes: 45
  • Nacionalidad: cl
  • Super duper divertido xDD
    • Ver Perfil
Re:Ordenar strings en un archivo texto
« Respuesta #6 en: Martes 13 de Marzo de 2012, 03:04 »
0
Si bien entiendo quieres ordenar un vector de números de menor a mayor.

Hay muchos métodos documentados. Este es el de burbuja:

http://es.wikipedia.org/wiki/Ordenamiento_de_burbuja

En resumen. Tienes un vector A unidimensional de n posiciones. Coges un elemento j  y compruebas si para j+1 A(j+1)<A(j). En caso positivo intercambias posiciones y continuas. Recorres el vector para cada uno de los elementos i (te aseguras de ordenarlos todos).

for(i=0; <n; i++){
    for(j=0; j<n-1; j++){
          if(A[j]>A[j+1]){
                x = A[j];
                A[j] = A[j+1];
                A[j+1] = x;
           }
     }
}

no te mentire, suena muy interesante, pero prefiero ir con algo que entiendo mas por ahora... ademas el tiempo que tengo debido a las clases es casi nulo :s
Lo dificil se hace... lo imposible se intenta
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.(Frase de Albert Einstein)