2012-07-12 18 views
5

Tengo un archivo .txt que tiene un montón de datos formateados en ella que se parece a lo siguiente:de ancho fijo, espacio delimitado archivo .txt en MySQL

... 
    1  75175.18  95128.46 
    1 790890.89 795829.16 
    1 875975.98 880914.25 
    8 2137704.37 2162195.53 
    8 2167267.27 2375275.28 
    10 2375408.74 2763997.33 
    14 2764264.26 2804437.77 
    15 2804504.50 2881981.98 
    16 2882048.72 2887921.25 
    16 2993093.09 2998031.36 
    19 3004104.10 3008041.37 
... 

Estoy tratando de cargar cada fila como una entrada en una tabla en mi base de datos, donde cada columna es un campo diferente. Tengo problemas para que mySQL separe todos los datos correctamente. Creo que el problema viene del hecho de que no todos los números están separados por una cantidad equidistante de espacio en blanco.

Éstos son dos consultas que he probado hasta ahora (También he intentado varias variaciones de estas consultas):

LOAD DATA LOCAL INFILE 
'/some/Path/segmentation.txt' 
INTO TABLE clip (slideNum, startTime, endTime) 
SET presID = 1; 


LOAD DATA LOCAL INFILE 
'/some/Path/segmentation.txt' 
INTO TABLE clip 
FIELDS TERMINATED BY ' ' 
LINES TERMINATED BY '\n' 
(slideNum, startTime, endTime) 
SET presID = 1; 

Alguna idea de cómo conseguir que esto funcione?

+0

También, observe el espacio en blanco solo al comienzo de cada línea. – bddicken

Respuesta

10

Estos son lo que llamamos "de ancho fijo" registros y cargar datos no juega bien con ellos. Opciones:

  1. Limpiar los datos en Excel primero, o
  2. de carga hasta los datos en una tabla temporal con sólo 1 columna, empujando una fila de texto entero en esa columna. Luego puede usar SUBSTR() y TRIM() para dividir las columnas que necesita en la tabla final.
  3. O con variables de usuario (@row) puede hacerlo todo dentro de la instrucción LOAD DATA.
LOAD DATA LOCAL INFILE 
'/some/Path/segmentation.txt' 
INTO TABLE clip 
(@row) 
SET slideNum = TRIM(SUBSTR(@row,1,4)), 
    startTime = TRIM(SUBSTR(@row,5,13)), 
    endTime = TRIM(SUBSTR(@row,18,13)) 
; 
+0

Ok, genial. ¿Esta consulta funcionaría mejor si hubiera solo un espacio entre cada valor? Probablemente no sea tan difícil escribir un guión que haga el espaciado más consistente. – bddicken

+0

Normalmente, debe usar comas, puntos y comas, pestañas o derivaciones ('|') para separar los campos de los archivos de texto (CSV = valores separados por comas es el formato más común). Entonces LOAD DATA puede manejarlos fácilmente. –

+0

Guau, la opción 3 (y la consulta que iba con ella) funcionó perfectamente, ¡gracias! – bddicken

0
LOAD DATA 
CHARACTERSET AL32UTF8 
INFILE 'DCF Master 14APR2013 VSPCFM_reduced size.txt' 
INTO TABLE EMPLOYEE3 
(
a = TRIM(SUBSTR(@row,1,11)), 
b = TRIM(SUBSTR(@row,33,38)), 
c = TRIM(SUBSTR(@row,70,86)) 
) 
Cuestiones relacionadas