2012-03-29 9 views
5

Necesito convertir datos de una hoja de cálculo en instrucciones de inserción en SQL. He resuelto la mayoría de las expresiones regulares para usar la herramienta de búsqueda y reemplazo en SSMS, pero me encuentro con un problema al tratar de hacer referencia al noveno elemento entre paréntesis en mi reemplazo final.SQL buscar y reemplazar el límite de grupo de captura de expresiones regulares?

Aquí está el registro original:

Blue Doe 12/21/1967 1126 Queens Highway Torrance CA 90802 N 1/1/2012 

Y esto es lo que necesito (por ahora):

select 'Blue','Doe','19671221','1126 Queens Highway','Torrance','CA','90802','N','20120101' 

Debido a las limitaciones en el número de elementos entre paréntesis se admiten tengo que correr a través el reemplazo tres veces. Esto puede funcionar en un procedimiento almacenado si primero puedo hacer que esto funcione como un POC.

Ésta es la primera expresión coincidente:

^{:w:b:w:b}{:z}/{:z}/{:z:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b}{:z}/{:z}/{:z} 

Y la sustitución: \10\2/0\3/\40\5/0\6/\7

Esto añade ceros a los meses y los días para que tengan al menos dos caracteres.

La próxima coincidencia reformatea las fechas en el formato requerido en la consulta (no hay comentarios sobre el uso de un campo de fecha. Este es un requisito del cliente para la base de datos).

Coincidencia de expresión:

^{:w:b:w:b}[0-9]*{[0-9]^2}/[0-9]*{[0-9]^2}/{:z}{:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b}[0-9]*{[0-9]^2}/[0-9]*{[0-9]^2}/{:z} 

Y la reemplace: \1\4\(2,2)\(2,3)\5\8\(2,6)\(2,7)

Finalmente, el último partido inserta los resultados en la instrucción SQL que se acostumbrará en una instrucción de inserción.

Coincidencia de expresión:

^{:w}:b{:w}:b{:z}:b{[0-9A-Za-z:b]+}:b{:w}:b{[A-Z]+}:b{:z}:b{:w}:b{:z} 

Y la sustitución: select '\1','\2','\3','\4','\5','\6','\7','\8','\9'

funciona todo excepto el último reemplazo. Por algún motivo, el \ 9 NO obtiene los datos del partido. Si simplemente reemplazo toda la expresión de reemplazo con \ 9, obtengo un espacio en blanco. Si uso \ 8, obtengo N. Si elimino el 8º elemento entre paréntesis, convirtiendo así mi noveno ítem en octavo, devuelve lo que quiero, 20120101.

Así que mi pregunta es, ¿permite SSMS/SQL etiquetar 9? expresiones al usar find/replace y expresiones regulares? ¿O me estoy perdiendo algo aquí? Sé que hay otras formas de hacer esto. Solo estoy tratando de hacerlo rápidamente como un POC antes de mover esto a un sproc o aplicación.

Gracias por cualquier ayuda. -Peter

+0

Puede importar desde una hoja de cálculo directamente. ¿Los datos ya están en columnas separadas? – RedFilter

+0

¿Por qué necesita reemplazar? Si los datos provienen de una hoja de cálculo y está utilizando SSMS, ¿por qué no utilizar el administrador de importación/exportación? Además, ¿por qué reformatear los datos? ¿La hoja de cálculo no admite formatos de fecha mm/dd/aaaa? ¿No podría escribir algunas fórmulas de celda para concatenar una cadena que inserta los datos por usted? – Trisped

+0

Edite su pregunta para agregar el formato adecuado de las expresiones de código. Puede hacer esto: rodeando con patillas ("' "), seleccionando todo y haciendo clic en el botón de la barra de herramientas' {} ', o marcando un bloque de código y presionando Ctrl + K. Puede obtener una vista previa de su publicación (antes de publicarla) inmediatamente debajo del botón "Enviar pregunta" mientras la ingresa; las actualizaciones de vista previa en tiempo real, por lo que es una vista WYSIWYG. El formateo adecuado hace que su pregunta sea más fácil de leer y comprender, y por lo tanto aumenta la probabilidad de que obtenga una respuesta. Gracias. :) –

Respuesta

2

Ninguna de sus expresiones coincidentes funciona con el registro que proporcionó en mi MS SQL Server Management Studio 2008r2.

De su descripción parece que hay un problema con la expresión etiquetada 9 ya que se devuelve el resultado deseado cuando se utiliza la expresión etiquetada 8, pero no la 9. Puede querer ask Microsoft or report it as a bug.

Una solución más rápida sería mover el texto que está realizando Buscar/Reemplazar en SSMS a una hoja de cálculo y usar fórmulas de celda para analizar los datos en comandos de inserción. Si tiene MS Excel, las funciones CONCATENAR, ENCONTRAR y MID serán probablemente útiles. Además, ayuda a dividir los valores en sus propias columnas para que pueda formatear la fecha, luego use una concatenación para construir su inserción.

Háganme saber si necesita un ejemplo.

Actualización: Probé su ejemplo en MS SQL Server Management Studio 2008r2, Visual Studio 2005 y Visual Studio 2010 con el mismo resultado que obtiene, \ 9 devuelve una cadena vacía. Revisando encontré que others are also having this issue (ver el contenido de la comunidad de Henrique Evaristo) y que todo el sistema ha sido replaced in the new editors.

Respondiendo a su pregunta, SSMS no admite 9 expresiones etiquetadas debido a un error.

Si no puede utilizar la idea de la hoja de cálculo, puede intentar dividir la acción en dos partes, estableciendo los primeros 8 valores y luego volviendo a la última para hacer la última. Por ejemplo:

^{:w}:b{:w}:b{:z}:b{[0-9A-Za-z:b]+}:b{:w}:b{[A-Z]+}:b{:z}:b{:w}:b:z 
select '\1','\2','\3','\4','\5','\6','\7','\8','\0' 

:w:b:w:b:z:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b{:z} 
\1 
+0

Gracias por su respuesta. Creo que la razón por la que no funcionan para usted es un problema con la forma en que fueron pegados en SO. He actualizado el texto original para reflejar el 'espacio singular' entre cada elemento que aparece como múltiple cuando se pega de SQL a SO. –

+0

@Peter Anderson actualizado con resultados. Cambiaría a Excel o codificaría su propia solución, pero la he suministrado en caso de que la desee. Es posible que prefiera el prefijo '\ 0' con un carácter especial, ya que no podrá buscar por línea. O bien, podría cambiar la segunda consulta para encontrar el '\ 0' en la selección y trabajar desde allí. – Trisped

+0

Gracias por su respuesta sobre esto. Eso es lo que necesitaba. Y gracias por la opción adicional al final. Ya estoy dividiendo esta cosa tres veces para manejar las varias sustituciones, no había pensado usar el \ 0 y tomar el último bit en un cuarto reemplazo. Gracias de nuevo. –

Cuestiones relacionadas