Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Suma de campos coincidentes y reemplazo de líneas

Estas en el tema de Suma de campos coincidentes y reemplazo de líneas en el foro de Bases de Datos General en Foros del Web. Amigos: Gracias al compañero Uamistad he podido convertir un CSV a formato TXT de ancho fijo. Realmente el trabajo quedó bien. Sin embargo, cuando estoy ...
  #1 (permalink)  
Antiguo 03/05/2006, 13:10
Avatar de tonymontana  
Fecha de Ingreso: abril-2006
Mensajes: 27
Antigüedad: 18 años
Puntos: 0
Suma de campos coincidentes y reemplazo de líneas

Amigos:
Gracias al compañero Uamistad he podido convertir un CSV a formato TXT de ancho fijo. Realmente el trabajo quedó bien. Sin embargo, cuando estoy por subir este archivo TXT al programa lector de bases de datos, me tira un error diciéndome que hay registros duplicados, y es verdad! El tema es que no sé como hacer para sumar las líneas que tengan un campo conicidente y reemplazar todas las repetidas.
Creo que debería pasar este trabajo a un verdadero programador. ¿Que dicen? ¿Se puede hacer?

Aqui el ejemplo con descripciones gráficas sobre una captura TXT:
http://www.pellegrinioscarv.com.ar/i...neas-sumar.jpg

Aquí el mismo ejemplo en formato CSV:
1;1;4010.29.00.000R;0,23;9999,99;1;45,25;7;0,00
1;1;4010.29.00.000R;0,23;9999,99;1;35,24;7;0,00
1;1;4010.29.00.000R;0,23;9999,99;1;48,72;7;0,00
1;1;2010.29.00.000X;0,33;9999,99;1;75,70;7;0,00
1;1;7010.29.00.000L;0,13;9999,99;1;71,20;7;0,00

Que opinan?

Antonio
  #2 (permalink)  
Antiguo 03/05/2006, 16:30
Avatar de Linterns
Colaborador
 
Fecha de Ingreso: diciembre-2001
Mensajes: 2.799
Antigüedad: 22 años, 4 meses
Puntos: 11
Ese problema se presenta debido a que no puedes comparar un TXT con la base de datos al momento de "migrar" la informacion asi que lo que te recomiendo es que subas dicha informacion a una tabla temporal con la misma estructura de la tabla donde deberan quedar dichos campos (solo que dicha tabla temporal debe permitir repetidos). Una vez migrado ya puedes saber que hacer con cada tupla (registro) de la tabla temporal (si vas a insertar o actualizar) sobre la tabla original.

Al final borra la informacion de la tabla tempral para dejarla limpia para una nueva migracion
__________________
Bien se puede recibir una puñalada sin adulación,
pero rara vez se recibe una adulación sin puñalada
** ***
  #3 (permalink)  
Antiguo 03/05/2006, 19:21
Avatar de tonymontana  
Fecha de Ingreso: abril-2006
Mensajes: 27
Antigüedad: 18 años
Puntos: 0
Linterns:
Lo que vos decís es que suba la base de CSV a una tabla, del tipo por ejemplo MySQL y que desde ahí la elabore? ¿con que función sql puedo hacerlo?

Saludos!
  #4 (permalink)  
Antiguo 04/05/2006, 08:05
Avatar de Linterns
Colaborador
 
Fecha de Ingreso: diciembre-2001
Mensajes: 2.799
Antigüedad: 22 años, 4 meses
Puntos: 11
a ver si te entiendo... quieres importar a una base de datos o quieres manejar la informacion a nivel del TXT que has fabricado?
__________________
Bien se puede recibir una puñalada sin adulación,
pero rara vez se recibe una adulación sin puñalada
** ***
  #5 (permalink)  
Antiguo 04/05/2006, 08:31
Avatar de tonymontana  
Fecha de Ingreso: abril-2006
Mensajes: 27
Antigüedad: 18 años
Puntos: 0
Linterns:
Quiero manejar manejar la informacion a nivel del TXT que he fabricado. Pero si es necesario, por ejemplo, puedo manejarme con un CSV.
  #6 (permalink)  
Antiguo 04/05/2006, 14:05
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
Ese men !

Recibí tus pics, ya las metí en mi header, se ve de luxe !!

'Ta crítico tu caso, aunque bien puedes subir tu base de datos, man, asignándole una clave autonumérica y luego con una suma de datos agrupando las columnas repetidas que quieras, te dará como resultado una tran tabla con los datos tal cuál los quieres.

Digamos que la siguiente tabla:
1;1;4010.29.00.000R;0,23;9999,99;1;45,25;7;0,00
1;1;4010.29.00.000R;0,23;9999,99;1;35,24;7;0,00
1;1;4010.29.00.000R;0,23;9999,99;1;48,72;7;0,00
1;1;2010.29.00.000X;0,33;9999,99;1;75,70;7;0,00
1;1;7010.29.00.000L;0,13;9999,99;1;71,20;7;0,00

la metes en una base de datos y haces lo de sumar y agrupar, te quedaría así (las mismas líneas):

1;1;4010.29.00.000R;0,23;9999,99;1;129,21;7;0,00
1;1;2010.29.00.000X;0,33;9999,99;1;75,70;7;0,00
1;1;7010.29.00.000L;0,13;9999,99;1;71,20;7;0,00

creo que es lo que te andas preguntando.

Entonces, comienza con subir esas filas de datos a una tabla, primero define la tabla, ésta tendría 10 campos (porque hay 9 campos separados por ";" y le agregamos una por el formato autonumérico para que la base de datos no te diga que se están repitiendo).

Te quedaría más o menos así:

Código:
CREATE TABLE filastemporales (
  id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  campo1 CHAR(30) NOT NULL,
  campo2 CHAR(30) NOT NULL,
  campo3 CHAR(30) NOT NULL,
  campo4 CHAR(30) NOT NULL,
  campo5 CHAR(30) NOT NULL,
  campo6 CHAR(30) NOT NULL,
  campo7 CHAR(30) NOT NULL,
  campo8 CHAR(30) NOT NULL,
  campo9 CHAR(30) NOT NULL,
  PRIMARY KEY(id)
);
No importa exagerar en el tamaño de los strings, ahorita le puse 30 na' más porque se me ocurrió, pero bueno, da igual.

La columnas sobre las que vayas a hacer operaciones, defínelas como numéricos flotantes. Nunca he trabajado con números de punto flotante en que éste está separado por coma, aquí en Méx no se acostumbra pero no debería haber problemas, ¿vale?

Para cargar la información a MySQL en forma masiva necesitarás de LOAD DATA (su definición):

Código:
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [FIELDS
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number LINES]
    [(col_name_or_user_var,...)]
    [SET col_name = expr,...)]
... parece más apantallador de lo que es.

Chécate este micro ejemplo que copié un día de alguna page y lo anoté aquí en mi libro de MySQL:

Código:
//hacemos un archivo simplón nada más para probar (en la raíz de public_html):
echo 'a b c d' > testfile.txt

//entro a la consola de MySQL
mysql -u uamistad -p (mi password)

//creo una tabla en donde almacenaré la info que metí en testfile.txt
CREATE TABLE test(
 fe VARCHAR(2),
 fi VARCAHR(2),
 fo VARCHAR(2),
 fu VARCHAR(2)
);

//cargo la información a la tabla
LOAD DATA LOCAL INFILE '/www/proyecto/public_html/testfile'
INTO TABLE test
FIELDS terminated by ' '
LINES terminated by '\n';

//y listo, ya con hacer lo anterior, se cargó la info del archivo a la tabla
// y se prueba con:
SELECT * FROM test;


//lo cual arroja el siguiente resultado:
---------------------------------------
fe  |  fi  |   fo  |   fu
---------------------------------------
 a  |  b  |   c   |    d
---------------------------------------
Dale una ojeada, checa por ahí con Mr. Google a ver si hay algún ejemplo. Me voy a la uni, hay cualquier duda postea.
__________________
"Di no al Internet Explorer" -Proverbio Chino-
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:43.