sql >> Base de Datos >  >> RDS >> Mysql

Filtre la entrada nula o vacía usando LOAD DATA INFILE en MySQL

Haría esto filtrando el archivo con grep o awk y luego canalizarlo a MySQL (a través de /dev/stdin ). Algo como esto:

cat your_file.txt |
  awk '/\t.+/' |
    mysql -u your_username -pyour_password \
      -e "LOAD DATA LOCAL INFILE '/dev/stdin' \
          IGNORE INTO TABLE tablename         \
          COLUMNS TERMINATED BY '\t'          \
          LINES TERMINATED BY '\n'            \
          (col1, col2);" \
      your_database_name

La expresión regular dada a awk en la segunda línea solo coincide con cualquier línea que tenga un carácter de tabulación seguido de uno o más de cualquier carácter. Es posible que desee modificarlo para que se ajuste a sus necesidades.

Editar: Se me ocurrió otra posibilidad. Podrías usar SET para establecer algún valor mágico en las columnas que están en blanco y poner un BEFORE INSERT desencadenar en la tabla que abandonará una fila cuando vea ese valor. No tengo mucha experiencia con disparadores, pero creo que algo como esto debería funcionar:

CREATE TRIGGER skip_magic_rows
  BEFORE INSERT ON tablename
  FOR EACH ROW
  BEGIN
    IF NEW.col2 = 'IDSPISPOPD4815162342' THEN  # Some unlikely magic string
      # Trigger an error, which will cause the INSERT to fail†

      # If you have MySQL < 5.5 this is kludgy -- see Note 1
      DROP TABLE `Skipped row`

      # OR

      # In MySQL >= 5.5 you can send a signal--'45000' is a generic error
      SIGNAL SQLSTATE '45000' SET message_text = 'Skipped row';  # See Note 2

    END IF
  END
;

†: Según los documentos :

Entonces...

LOAD DATA LOCAL INFILE 'file' 
  IGNORE INTO TABLE tablename 
  COLUMNS TERMINATED BY '\t' 
  LINES TERMINATED BY '\n'
  (col1, @var2)
  SET col2 = IF(@var2 IN (NULL, ''), 'IDSPISPOPD4815162342', @var2)
;

¡Espero que sea útil!

Nota 1: Comentarios y publicaciones de blog relevantes
Nota 2: Subproceso SO relevante