¿Cómo formateo este texto? Java

votos
46

Así que aquí está el problema. Convertir un archivo de texto en el formato correcto. El punto del problema es que tengo que leer un archivo, un archivo de texto, que contiene el código en ese archivo de texto. El código en el que tiene terribles formato. El problema de formato es que cuando hay una llave de esta manera {, la siguiente línea es no 4 espacios a la derecha, es simplemente todo a la izquierda del todo. Me gusta esto:

while (blah blah blah) { 
sysout(blahblahblah);

Cuando debería ser la siguiente:

while (blah blah blah) { 
    sysout(blahblahblah); 

Y no hay ninguna otra diferencia entre el 2. La única regla es simplemente hacer que sea por lo que cada vez que hay una llave como esto {, para asegurarse de que la siguiente línea es de 4 espacios a la derecha. Y viceversa. Así que cada vez que hay una llave como esto}, la siguiente línea debe ser de 4 espacios a la izquierda. Espero que ustedes entienden esto.

Este es mi problema. Aprendí cómo hacer un programa en el que una porción de texto con múltiples espacios y líneas se convierte en una sola línea con un único espacio cada vez. No fue muy difícil.

Para esto, sin embargo, tengo que mantener todo en la misma línea. Así que si hay 30 líneas, el nuevo programa que hago es también 30 líneas. Necesito mantener el espaciamiento muy similares, pero la diferencia simple es todo el asunto aparato ortopédico. Así que, básicamente, sólo tengo que hacer la línea después de un corsé o bien 4 espacios a la derecha, y luego hacer lo mismo por lo que está a la izquierda 4 plazas de si es una }llave de cierre.

Entonces, ¿cómo hago esto exactamente? No sé cómo se acaba de arreglar eso sin tocar otras cosas. Es una cosa tan simple que tengo que hacer; simplemente hacer las siguientes líneas de los tirantes 4 espacios a la derecha oa la izquierda, pero no tiene idea de lo que la sintaxis a utilizar para lograr esto. ¡Gracias!

EDIT: Esto podría haber sólo lo hizo más fácil. Así que, básicamente, todas las líneas de cualquiera de los extremos con una llave derecha rizado, una llave izquierda, o un punto y coma. No importa qué. Así que cada vez que uno de esos aparece, es el final de una línea. Así que tal vez si se sabe que hace que sea más fácil, a continuación, sólo estoy dejando que usted sabe.

Publicado el 29/02/2016 a las 20:04
por usuario
En otros idiomas...                            


3 respuestas

votos
0

Hay programas que lo hará de forma automática, por lo que no es necesario reinventar la rueda. Por ejemplo, en Eclipse, escriba: ctrl-a(seleccionar todos) ctrl-i(auto-guión).

Respondida el 29/02/2016 a las 20:43
fuente por usuario

votos
0

He aquí un pseudocódigo se puede empezar con:

int indentLevel = 0;
while(currentchar = nextchar != null){
    printCurrentChar
    if(currentchar is '{'){
        indentLevel++;
    }else if(currentchar is '}'){
        indentLevel--;
    }else if(currentchar is '\n'){
        print indentLevel * 4 spaces
    }
}

puede que tenga que lidiar con los apoyos escapado y otras complicaciones, aunque

Respondida el 29/02/2016 a las 20:54
fuente por usuario

votos
0

Usted puede hacer esto con bastante facilidad utilizando expresiones regulares. Si no lo sabes y planeando ser un programador, entonces definitivamente aprenderlo. Se guardará para usted un montón de tiempo en el futuro.

public class TextIndentator
{

    public static void main(String[] args) throws IOException
    {
        File uglyText = new File("ugly.txt");
        System.out.println((uglyText.exists() && !uglyText.isDirectory()) ? getNiceText(uglyText) : "FILE \"ugly.txt\" at " + System.getProperty("user.dir") + " do not exists");
    }

    static String getNiceText(File uglyText) throws IOException
    {
        // Opening file
        FileInputStream inputStream = new FileInputStream(uglyText);
        InputStreamReader isr = new InputStreamReader(inputStream);
        BufferedReader reader = new BufferedReader(isr);
        StringBuilder builder = new StringBuilder();
        StringBuffer buffer = new StringBuffer();

        // Algorithm starts here
        String line;
        boolean checkNext = false;
        while ((line  = reader.readLine()) != null)
        {
            if(checkNext)
            {
                // If previous line finished with '{' (And optionally with some whitespaces after it) then, replace any amount (including zero) of whitespaces with 4 witespaces
                builder.append(line.replaceFirst("\\s*", "    "));
            }
            else
            {
                builder.append(line);
            }
            // Check if line line finishes with { (And optionally with some whitespaces after it)
            if(line.matches(".*\\{\\s*")) checkNext = true;
            else checkNext = false;

            //Append line separator at the end of line
            builder.append(System.getProperty("line.separator"));
        }
        return builder.toString();
    }

}
Respondida el 29/02/2016 a las 23:01
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more