Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Cruzar dos datatables

Iniciado por Diferencial, 08 de Febrero de 2007, 02:16:20 PM

« anterior - próximo »

Diferencial

Hola a todos,
Tengo por un lado una tabla con unos registros y por otro lado una tabla con el mismo esquema de datos y otros registros. ¿Existe alguna forma de cruzar estas tablas para que me devuelva una tabla con los registros que tengan en comun pero que exista algun campo modificado en una de ellas? Si esto se puede hacer ¿Existe alguna forma de cruzarlas y que te devuelva una tabla con los registros que este en una de ellas pero no en la otra? muchas gracias de antemano.
PARA TENER COSAS QUE NUNCA HAS TENIDO, TENDRÁS QUE HACER COSAS QUE NUNCA HAS HECHO.

killrazor

Puedes poner algun ejemplillo?

Diferencial

Tabla A
ID,Nombre,Apellidos,Edad...
1,Javi,Estrella,27....

Tabla B
ID,Nombre,Apellidos,Edad...
1,Javi,Estrella,29...
2,Ana,Garcia,29...

Como resultado me tendria que dar esto
Tabla X para las altas es decir para registros que la tabla A no tiene
ID,Nombre,Apellidos,Edad...
2,Ana,Garcia,29...
Tabla X1 para las modificaciones
ID,Nombre,Apellidos,Edad...
1,Javi,Estrella,29...

A y B son DataTable
El problema radica que hay un proceso muy costoso que tengo que optimizar. Recibo un fichero de texto plano cada 30 minutos ~25000 registros y tengo que compararlos con los que hay en una tabla que contiene ~60000. De ahi mi pregunta.
PARA TENER COSAS QUE NUNCA HAS TENIDO, TENDRÁS QUE HACER COSAS QUE NUNCA HAS HECHO.

killrazor

Y he de suponer que los tienes en una base de datos? O en un fichero? Es que no se que es un DateTable. Me estas hablando de php? Mysql? C++?

Si los recibes en una tabla texto como csv, y tienes una base de datos, puedes insertar en mysql ese archivo eb yba tabla auxiliar. Despues con una query, saber la lista de elementos que estan en los dos, y esto no seria tan costoso.

Para finalizar, borras la tabla auxiliar y aire

shephiroth

Buenas.

Eso de DateTable me suena que estas usando .net, lo q no se si en Visual Basic, en c# o en q exactamente.

Mi consejo va con una pregunta que ya te han hecho, te llega por archivo de texto o estan ya en sql?? Si te llega en texto yo te aconsejaria que te crearas tu una funcion que las comparase...previamente le pones a tu tabla de 60.000 un indice para q sea mas rapida (si no lo tenia) y asi te sera mucho mas facil. Creo que habia una funcion en DateTable que te permitia buscar por el campo indice ^^

Si los datos los tienes en sql, entonces mejor haz q trabaje el servidor de base de datos.

SUERTE

killrazor

Si la base de datos es mysql, creo que es capaz de comerse un csv en texto con una sola orden. Es mas lento por que lo tienes que copiar a una tabla pero si no programas muy bien, seguro que el resultado es mucho mas rapido.

Diferencial

Extrañamente parece que al final no llego la respuesta que puse, pero es ado .net el lenguaje que uso es c#. El fichero de texto es de un as400 que recibo. No es csv, hasta ahora como lo hacen es coger el campo id y lo van comparando contra la tabla que contiene 60000, con lo que es un proceso muy lento. Mi idea es intentar sacar un datatable de la tabla de 60000 y lo mismo con los 25000 registros del fichero. Intentar que se cruce las tablas para ver si existe alguna forma de que te devuelvan los registros que halla algun campo que este modificado y los registros que no esten. Pero si alguien que sabe mas que yo del tema se le ocurre alguna forma mas optima de hacer esto, pues a la escucha estoy.
PARA TENER COSAS QUE NUNCA HAS TENIDO, TENDRÁS QUE HACER COSAS QUE NUNCA HAS HECHO.

bnl

Creo que no hay una forma directa de hacerlo.
Podrias crearte sobre un datatable una primary key (sobre el que tenga mas datos) y recorrerte todas las filas del otro y por cada registro (datarow) buscar su ID en el otro datatable con el metodo miDT2.Rows.Find (q utiliza la PK creada antes) te devolvera la fila q tenga ese ID o null si no existe el registro.

Es la forma que se me ocurre, pero no me parece que sea muy buena ni muy eficiente.
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

Diferencial

Creo que ahora mismo lo estan haciendo asi, pero lo leen del fichero de texto directamente. Se me acaba de ocurrir una idea existe algo para comparar entre ficheros de xml?
PARA TENER COSAS QUE NUNCA HAS TENIDO, TENDRÁS QUE HACER COSAS QUE NUNCA HAS HECHO.

Vicente

Con XPath puedes realizar queries sobre un fichero XML, pero no tengo ni idea de lo rápido o lento que es... Creo que la funcion es XmlNode.SelectNodes(string xpathQuery).

Un saludo!

Vicente

Diferencial

Gracias vicente, muy interesante.
PARA TENER COSAS QUE NUNCA HAS TENIDO, TENDRÁS QUE HACER COSAS QUE NUNCA HAS HECHO.

shephiroth

Buenas.

Solo por curiosidad, las tablas estan ordenadas de alguna manera?? ya sea por id o por nombre propio.....lo comento pq en vez de hacer una busqueda secuencial quizas te pueda interesar hacer otro tipo de busqueda mas adecuada.....no se si es su nombre, pero la busqueda de la tijera iria bien con tantos registros.

En caso de que no esten ordenados...la tabla q ya tienes, es siempre la misma?? Si es la misma podrías crearte tu los indices en un vector y aplicar lo de antes.

De todos modos lo de Xml suena interesante, ya nos contaras ^^

Vicente

Cita de: "shephiroth"no se si es su nombre, pero la busqueda de la tijera iria bien con tantos registros.

[OT]Creo que querías decir "búsqueda binaria" ;)[/OT]

shephiroth

No se su nombre real, yo siempre la llame de la tijera pq la vas "cortando" por la mitad, y teniendo tantos registros con un par de ifs te has pulido el 75% de la tabla, que no es poco.

Estoy mirando en la wikipedia, y si, es busqueda binaria xDD

bnl

Quiza te refieras al quick sort. Es bastante eficiente. Y si no recuerdo mal consistia en ir dividiendo todos los elementos en 2 mitades. Es un algoritmo del tipo divide y venceras.

Como dice Vicente el xpath esta muy bien para realizar busquedas en XML.

Puedes encontrar informacion sobre esto en http://www.w3schools.com/xpath/default.asp

Para hacer pruebas con XPATH te puedes bajar una pequeña aplicacion que tengo en mi blog (viene con codigo fuente) que te hace busquedas en xml y te resalta los resultado. Tambien te formatea el XML.

http://www.brausoft.com/descargas/

http://www.brausoft.com/2006/09/12/creando-un-visor-de-xml-parte-i/
http://www.brausoft.com/2006/09/13/creando-un-visor-de-xml-parte-ii/
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.