2010-09-06 9 views
7

Tengo un archivo de registro que contiene los siguientes datos nextLine() y hasNextLine():problema utilizando los métodos de escáner

ruta más corta (2) :: RV3280-RV0973C-RV2888C
ruta más corta (1): : RV3280-RV2502C
ruta más corta (2) :: RV3280-RV2501C-RV1263
ruta más corta (2) :: RV2363-Rv3285-RV3280

de cada línea, requiero el número dentro de los corchetes, el nombre de la primera proteína (RV3280 en la primera línea) y el nombre de la última proteína (RV2888C en la primera línea).

He escrito un código para esto usando el objeto Scanner.

try{ 
       Scanner s = new Scanner(new File(args[0])); 
       while (s.hasNextLine()) { 
        s.findInLine("Shortest path\\((\\d+)\\)::(\\w+).*-(\\w+)"); // at each line, look for this pattern 
        MatchResult result = s.match(); // results from 
        for (int i=1; i<=result.groupCount(); i++) { 
         System.out.println(result.group(i)); 
        } 
        s.nextLine(); // line no. 29 
       } 
       s.close(); 
     } 

     catch (FileNotFoundException e) { 
      System.out.print("cannot find file"); 
     } 

Obtengo los resultados deseados pero también recibo un mensaje de error. La salida que recibo para el archivo de entrada anterior es:

Exception in thread "main" java.util.NoSuchElementException: No line found 
     at java.util.Scanner.nextLine(Scanner.java:1516) 
     at nearnessindex.Main.main(Main.java:29) 
2 
RV3280 
RV2888C 
1 
RV3280 
RV2502C 
2 
RV3280 
RV1263 
2 
RV2363 
RV3280 
Java Result: 1 
BUILD SUCCESSFUL (total time: 1 second) 

¿Por qué ocurre este error y cómo puedo corregirlo?

Respuesta

3

Sus datos de entrada probablemente no termina con un separador de línea que causaría esto. Las llamadas a findInLine mueve el escáner más allá de la coincidencia de patrones y si usted está en el final de los datos de entrada al llamar nextLine que se lanzan al NoSuchElementException

Una solución fácil y sin re-organización del código a mucho sería poner fin al mismo tiempo bucle con:

if (s.hasNextLine()) { 
    s.nextLine(); 
} 
+0

Hola clave, sí, funciona tan pronto como se agrega un separador de línea. No pensé en el movimiento de Scanner hasta el final de la línea :) Muchas gracias y gracias por la corrección también. – Harish

0
public static void main(String[] args) { 
      Scanner s = new Scanner("Shortest path(2)::RV3280-RV0973C-RV2888C" 
        + "\nShortest path(1)::RV3280-RV2502C" 
        + "\nShortest path(2)::RV3280-RV2501C-RV1263" 
        + "\nShortest path(2)::RV2363-Rv3285-RV3280"); 
      while (s.hasNextLine()) { 
       s.findInLine("Shortest path\\((\\d+)\\)::(\\w+).*-(\\w+)"); // at each line, look for this pattern 
       MatchResult result = s.match(); // results from 
       for (int i = 1; i <= result.groupCount(); i++) { 
        System.out.println(result.group(i)); 
       } 
       s.nextLine(); // line no. 29 
      } 
      s.close(); 
    } 
} 

run: 
2 
RV3280 
RV2888C 
1 
RV3280 
RV2502C 
2 
RV3280 
RV1263 
2 
RV2363 
RV3280 
BUILD SUCCESSFUL (total time: 0 seconds) 

Esto funciona bien para mí, ¿quizás tiene algunos caracteres extraños o líneas vacías en su archivo?

2 líneas vacías al final me dan que: Excepción en hilo java.lang.IllegalStateException "principal": Ningún resultado fósforo disponible

Si el archivo de entrada es que estrictamente el formato, que puede hacer algo por el estilo , que es mucho más fácil porque usted puede deshacerse de ese desagradable expresión regular;)

String[] lines = new String[]{"Shortest path(2)::RV3280-RV0973C-RV2888C", "Shortest path(1)::RV3280-RV2502C", "Shortest path(2)::RV3280-RV2501C-RV1263", "Shortest path(2)::RV2363-Rv3285-RV3280", "\n", "\n"}; 
    final int positionOfIndex = 14; 
    final int startPositionOfProteins = 18; 
    for (String line : lines) { 
     if (!line.trim().isEmpty()) { 
      System.out.print(line.charAt(positionOfIndex) + ": "); 
      String[] proteins = line.substring(startPositionOfProteins).split("-"); 
      System.out.println(proteins[0] + " " + proteins[proteins.size() -1]); 

     } 
    } 
+0

2 líneas vacías al final dan "Resultado sin coincidencia" ya que la primera línea vacía está marcada para las coincidencias. Su código se deshace de la expresión regular "desagradable", pero lo que necesito es solo la primera y la última proteína, no la lista completa. Gracias de todos modos, ayudando, tal vez pueda usar esto en otro lado. – Harish

+0

sry no vio eso ... cambié una sola línea, debería funcionar ahora. – atamanroman

+0

hmm ... ya podría funcionar. – Harish

Cuestiones relacionadas