¿Cómo ordenar de A a Z cada linea de un archivo con Vb.Net?

publicado por: Anonymous

Necesito ordenar de A a Z cada línea de un archivo de texto con mas de 500.000 palabras. Cada una de éstas en una línea.

Ejemplo del archivo original:

abad
cabezota
bacanal
...

Ejemplo del archivo que necesito:

aabd
aaabcln
aabceotz

Muchas gracias.

Tengo que comentar, que he estado utilizando el siguiente código. Pero solo para unas pocas de líneas y no para 500.000. La compilación deja de responder, consumiendo casi 100 por 100 de los recursos CPU.

Fragmento de codigo Vb.Net

Public Function Ordenar(ByVal Fuente As String) As String  
    Dim chrs() As Char = Fuente.ToCharArray()  
    Array.Sort(chrs)  
    Return New String(chrs)  
End Function  

Private Sub BtnOrdenar_Click(sender As Object, e As EventArgs) Handles BtnOrdenar.Click  
    For Each lns As String In RichTextBox1.Lines  
        RichTextBox2.AppendText(Ordenar(lns) + vbCrLf)  
        Next  
End Sub  

solución

El código que pones en tu respuesta probablemente te vaya muy lento porque estás haciendo un bucle innecesario para cada fila. No necesitas un bloque For Each para usar Array.Sort. Tu código deberia ser simplemente:

Dim read As String = TextBox1.Text
Dim readText() As String = File.ReadAllLines(read)
Array.Sort(readText)
File.WriteAllLines(TextBox2.Text, readText, System.Text.Encoding.UTF8)

Aun así, tratándose de un número tan elevado de registros, es posible que tarde algun tiempo.

EDIT

Al parecer entendí mal la pregunta. De lo que se trata es de ordenar los caracteres dentro de cada linea. Para conseguirlo, podemos usar LINQ de una forma sencilla. No puedo probar el rendimiento ya que no tengo un archivo de texto tan grande, espero que sea suficientemente bueno:

Dim readText() As String = IO.File.ReadAllLines("C:temptest.txt")
Dim ordenados = readText.Select(Function(x) New String(x.ToArray().OrderBy(Function(y) y).ToArray()))
IO.File.WriteAllLines("C:temptest.txt", ordenados, System.Text.Encoding.UTF8)

Editado rafman.
Arreglando un poco la codificación, ya lo hemos conseguido.

Dim readText() As String = File.ReadAllLines(TextBox1.Text, Encoding.GetEncoding(1252))
Dim ordenados = readText.Select(Function(x) New String(x.ToArray().OrderBy(Function(y) y).ToArray()))
File.WriteAllLines(TextBox2.Text, ordenados)

Gracias de nuevo.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *