Estoy trabajando en una aplicación que importa miles de líneas, donde cada línea tiene un formato como este:C# Regex.Split: Extracción de resultados vacíos
|* 9070183020 |04.02.2011 |107222 |M/S SUNNY MEDICOS |GHAZIABAD | 32,768.00 |
estoy usando el siguiente Regex
para dividir las líneas a la datos que necesito:
Regex lineSplitter = new Regex(@"(?:^\|\*|\|)\s*(.*?)\s+(?=\|)");
string[] columns = lineSplitter.Split(data);
foreach (string c in columns)
Console.Write("[" + c + "] ");
Esto me está dando el siguiente resultado:
[] [9070183020] [] [04.02.2011] [] [107222] [] [M/S SUNNY MEDICOS] [] [GHAZIABAD] [] [32,768.00] [|]
N ow tengo dos preguntas
1. ¿Cómo elimino los resultados vacíos? Sé que puedo utilizar:
string[] columns = lineSplitter.Split(data).Where(s => !string.IsNullOrEmpty(s)).ToArray();
pero ¿hay alguna construida en el método para eliminar los resultados vacíos?
2. ¿Cómo puedo eliminar la última tubería?
Gracias por cualquier ayuda.
Saludos,
Yogesh.
EDIT:
creo que mi pregunta era un poco mal entendido. Nunca fue sobre cómo puedo hacerlo. Solo fue sobre cómo puedo hacerlo cambiando el Regex
en el código anterior.
Sé que puedo hacerlo de muchas maneras. Ya he hecho con el código mencionado anteriormente con una cláusula Where
y con una forma alternativa que también es (más de dos veces) más rápido:
Regex regex = new Regex(@"(^\|\*\s*)|(\s*\|\s*)");
data = regex.Replace(data, "|");
string[] columns = data.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
segundo lugar, como un caso de prueba, mi sistema puede analizar 92K + tales líneas en menos de 1.5 segundos en el método original y en menos de 700 milisegundos en el segundo método, donde nunca encontraré más de un par de miles en casos reales, así que no creo que deba pensar en la velocidad aquí . En mi opinión, pensar en la velocidad en este caso es la optimización prematura.
he encontrado la respuesta a mi primera pregunta: ¿no se puede hacer con Split
ya que no hay tal opción integrada en
Todavía estás buscando respuesta a la segunda pregunta..
para responder a su primera pregunta, cree que la parte de agrupación de la expresión regular debe ser '@" (. +?) "'. De lo contrario, sería posible hacer coincidir los espacios en blanco (que es lo que tienes ahora). –
No importa en este caso Jeff. Dará el mismo resultado exacto. – Yogesh
Al igual que una nota cuando mencionas miles de entradas: Usar String.Split y luego hacer algo más de procesamiento de cadenas es mucho más rápido que usar una Regex en primer lugar. – Foxfire