Pregunta

¿Cuál es la mejor manera de extraer cada campo de cada línea donde no hay una separación clara (deliminator) entre cada campo?

Este es un ejemplo de las líneas que necesito para extraer sus campos:

3/3/2010 11:00:46 AM                      BASEMENT-IN          
3/3/2010 11:04:04 AM 2, YaserAlNaqeb      BASEMENT-OUT         
3/3/2010 11:04:06 AM                      BASEMENT-IN          
3/3/2010 11:04:18 AM                      BASEMENT-IN          
3/3/2010 11:14:32 AM 4, Dhileep              BASEMENT-OUT         
3/3/2010 11:14:34 AM                      BASEMENT-IN          
3/3/2010 11:14:41 AM                      BASEMENT-IN          
3/3/2010 11:15:33 AM 4, Dhileep           BASEMENT-IN          
3/3/2010 11:15:42 AM                      BASEMENT-IN          
3/3/2010 11:15:42 AM                      BASEMENT-IN          
3/3/2010 11:30:22 AM 34, KumarRaju        BASEMENT-IN          
3/3/2010 11:31:28 AM 39, Eldrin           BASEMENT-OUT         
3/3/2010 11:31:31 AM                      BASEMENT-IN          
3/3/2010 11:31:39 AM                      BASEMENT-IN          
3/3/2010 11:32:38 AM 39, Eldrin           BASEMENT-IN          
3/3/2010 11:32:47 AM                      BASEMENT-IN          
3/3/2010 11:32:47 AM                      BASEMENT-IN          
3/3/2010 11:33:26 AM 34, KumarRaju        BASEMENT-OUT         
3/3/2010 11:33:28 AM                      BASEMENT-IN    

Hay 6 campos en cada línea y algunos de ellos pueden estar vacíos. ¿Cuál es la mejor manera de abordar este problema?

  • Estoy usando Java

Edición 01

  • Campo 5 puede estar vacía (sin embargo su existencia se debe reconocer en todos los casos)
  • Número de plazas puede cambiar
  • Última palabra puede cambiar
¿Fue útil?

Solución

A mí parece que hay 3 meta-campos:

3/3/2010 11:32:38 AM 39, Eldrin           BASEMENT-IN          
3/3/2010 11:32:47 AM                      BASEMENT-IN 

MF1: 3/3/2010 11:32:38 AM

MF2: 39, Eldrin

MF3: BASEMENT-IN

de los cuales MF2 es opcional. Mis delimitadores entonces serían:

MF1 hasta e incluyendo [AM | PM]

Número MF2, nada excepto SÓTANO - *

MF3 SÓTANO - *

No soy tan bueno en expresiones regulares pero me gustaría extraer los 3 grupos como algo parecido a

(anything)(AM|PM)(number,anything)?(BASEMENT-anything)

donde el? medios grupo opcional.

Otros consejos

Bueno, puede quitarse la fecha y los datos SÓTANO-FOO por número de columna, ya que siempre aparecen en el mismo punto en la línea. A continuación, puede dividir el resto basado en comas. Ya sea que necesite mango escapó comas \ o comas entre comillas "foo, bar" depende de usted y sus necesidades de negocio.

Puede hacer:

  • leer una línea completa como cadena.
  • divide la línea de lectura en espacios (\ s +). Usted debe conseguir 5 o 6 piezas.
  • piece0, piece1 y piece2 serán fecha, hora y AM / PM.
  • comprobar si tiene el número piece3: en caso afirmativo a continuación, lea la próxima pieza como nombre
  • última pieza es esa cosa sótano.
  • convertir las piezas de la cadena decir fecha, hora, int, según sea necesario.

Para las columnas de cada línea donde los caracteres en blanco son adyacentes a los no-blanco, y luego hacer un análisis estadístico de esos números:. Los que se producen en cada línea o casi todas las líneas son muy probablemente los límites del campo

Del mismo modo para puntuacion adyacente a las letras, pero en general es imposible adivinar si una - o una, está destinado a delimitar un campo o no. Si se produce en la misma posición en cada línea, podría ser un delimitador, pero en listas de cosas tales como D-FL R-TX D-NY probablemente no lo es. Así que no puede haber ninguna solución totalmente automática para datos arbitrarios.

Debido a que cada campo es muy distinta (al menos en el ejemplo que ha pegado arriba) se puede hacer esto:

  1. dividir la cadena en tokens.
  2. Ejecutar cada elemento de la matriz tokenized a través de un patrón de expresión.

Se puede usar Strtokenizer partir Commons Lang y especificar varios delimitadores a dividir en:

Hay una serie de construido en los tipos que se apoya a través de StrMatcher .

StrTokenizer(char[] input, StrMatcher delim) 

por ejemplo.

StrMatcher delims = StrMatcher.charSetMatcher(new char[] {' ', ',', '\n'});
StrTokenizer str = new StrTokenizer(match.toString(), delims);
while (str.hasNext()) {
    System.out.println("Token:[" + str.nextToken() + "]");
}

dará (en el ejemplo anterior):

Token:[3/3/2010]
Token:[11:00:46]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:04:04]
Token:[AM]
Token:[2]
Token:[YaserAlNaqeb]
Token:[BASEMENT-OUT]
Token:[3/3/2010]
Token:[11:04:06]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:04:18]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:14:32]
Token:[AM]
Token:[4]
Token:[Dhileep]
Token:[BASEMENT-OUT]
Token:[3/3/2010]
Token:[11:14:34]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:14:41]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:15:33]
Token:[AM]
Token:[4]
Token:[Dhileep]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:15:42]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:15:42]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:30:22]
Token:[AM]
Token:[34]
Token:[KumarRaju]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:31:28]
Token:[AM]
Token:[39]
Token:[Eldrin]
Token:[BASEMENT-OUT]
Token:[3/3/2010]
Token:[11:31:31]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:31:39]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:32:38]
Token:[AM]
Token:[39]
Token:[Eldrin]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:32:47]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:32:47]
Token:[AM]
Token:[BASEMENT-IN]
Token:[3/3/2010]
Token:[11:33:26]
Token:[AM]
Token:[34]
Token:[KumarRaju]
Token:[BASEMENT-OUT]
Token:[3/3/2010]
Token:[11:33:28]
Token:[AM]
Token:[BASEMENT-IN]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top