Mysql
 sql >> Database >  >> RDS >> Mysql

Filtra l'input nullo o vuoto usando LOAD DATA INFILE in MySQL

Lo farei filtrando il file con grep o awk e quindi inviarlo tramite pipe a MySQL (tramite /dev/stdin ). Qualcosa del genere:

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

L'espressione regolare data a awk sulla seconda riga corrisponde solo a qualsiasi riga che abbia un carattere di tabulazione seguito da uno o più caratteri qualsiasi. Potresti modificarlo per adattarlo alle tue esigenze.

Modifica: Mi è venuta in mente un'altra possibilità. Potresti usare SET per impostare un valore magico su colonne vuote e inserire un BEFORE INSERT trigger sul tavolo che verrà salvato su una riga quando vede quel valore. Non ho molta esperienza con i trigger, ma penso che qualcosa del genere dovrebbe funzionare:

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
;

†: Per i documenti :

Allora...

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)
;

Spero sia utile!

Nota 1: Post del blog e commenti pertinenti
Nota 2: Throw SO pertinente