2012-04-08 13 views
6

Quiero leer un archivo txt local y leer el texto en este archivo. Después de eso quiero dividir todo este texto en cadenas como en el ejemplo a continuación.Dividir archivo de texto en cadenas en la línea vacía

Ejemplo: permite decir archivo contenga-

abcdef         
ghijkl 

aededd    
ededed 

ededfe 
efefeef 
efefeff 

...... 
...... 

Quiero dividir este texto en Cuerdas para

s1 = abcdef+"\n"+ghijkl; 

s2 = aededd+"\n"+ededed; 

s3 = ededfe+"\n"+efefeef+"\n"+efefeff; 

........................ 

quiero decir que quiero dividir el texto en la línea vacía.

Sé leer un archivo. Quiero ayudar a dividir el texto en el que las cadenas

+0

¿Estás seguro de que leer todo el archivo y luego dividir una cadena tan larga es una buena idea? Te sugiero que, en cambio, leas por líneas, las adjuntas a '' StringBuilder'' mediante '' \ n'' hasta que leas la línea en blanco. –

+0

'string.split (" \ n \ r ")' Encuentra esta respuesta [aquí] (http://stackoverflow.com/questions/11717667/how-to-split-string-with-empty-new -line) – Shushan

Respuesta

6

se puede dividir una cadena en una matriz mediante

String.split(); 

si desea que las nuevas líneas será

String.split("\\n\\n"); 

ACTUALIZACIÓN *

Si entiendo lo que dices, entonces john.

entonces su código será esencialmente

BufferedReader in 
    = new BufferedReader(new FileReader("foo.txt")); 

List<String> allStrings = new ArrayList<String>(); 
String str =""; 
while(true) 
{ 
    String tmp = in.readLine(); 
    if(tmp.isEmpty()) 
    { 
     if(!str.isEmpty()) 
     { 
      allStrings.add(str); 
     } 
     str= ""; 
    } 
    else if(tmp==null) 
    { 
     break; 
    } 
    else 
    { 
     if(str.isEmpty()) 
     { 
      str = tmp; 
     } 
     else 
     { 
      str += "\\n" + tmp; 
     } 
    } 
} 

podría ser lo que usted está tratando de analizar.

Donde allStrings es una lista de todas sus cadenas.

+0

Creo que el patrón debería ser \\ n \\ n para líneas dobles. – GavinCattell

+0

@GavinCattell Gracias, actualizado – Kevin

+0

no en la nueva línea Quiero dividir cadenas en línea vacía porque String puede ser cualquier cantidad de líneas. –

4

Esto puede depender de cómo se codifica el archivo, por lo que es probable que haga lo siguiente:

String.split("(\\n\\r|\\n|\\r){2}"); 

Algunos archivos de texto codifican las nuevas líneas como "\ n \ r", mientras que otros pueden ser simplemente "\ n" . Dos nuevas líneas seguidas significan que tienes una línea vacía.

4

El siguiente código funcionaría incluso si hay más de 2 líneas vacías entre datos útiles.

import java.util.regex.*; 

// read your file and store it in a string named str_file_data 

Pattern p = Pattern.compile("\\n[\\n]+");  /*if your text file has \r\n as the newline character then use Pattern p = Pattern.compile("\\r\\n[\\r\\n]+");*/ 
String[] result = p.split(str_file_data); 

(no he probado el código de lo que podría haber errores tipográficos.)

3

Yo sugeriría expresión regular más general:

text.split("(?m)^\\s*$"); 

En este caso funcionaría correctamente en cualquier End- de la convención de línea, y también trataría las mismas líneas vacías y de espacio en blanco solamente.

2

Godwin estaba en el camino correcto, pero creo que podemos hacer que esto funcione un poco mejor. El uso de '[]' en regx es una o, así que en su ejemplo, si tuviera una \ r \ n, esa sería simplemente una nueva línea, no una línea vacía. La expresión regular la dividiría entre \ r y \ n, y creo en el ejemplo que estábamos buscando una línea vacía que requeriría un \ n \ r \ n \ r, a \ r \ n \ r \ n, a \ n \ r \ r \ n, a \ r \ n \ n \ r, o a \ n \ n o a \ r \ r

Así que primero queremos buscar \ n \ r o \ r \ n dos veces, con cualquier combinación de las dos posibles.

String.split(((\\n\\r)|(\\r\\n)){2})); 

siguiente que necesitamos para buscar \ r sin \ n después de que

String.split(\\r{2}); 

por último, vamos a hacer lo mismo para \ n

String.split(\\n{2}); 

Y todos juntos que deben ser

String.split("((\\n\\r)|(\\r\\n)){2}|(\\r){2}|(\\n){2}");

Nota, esto funciona solo en el ejemplo muy específico de usar nuevas líneas y retornos de caracteres. Yo en Ruby puedes hacer lo siguiente que abarcaría más casos. No sé si hay un equivalente en Java.

.match($^$) 
Cuestiones relacionadas