Mysql
 sql >> Base de données >  >> RDS >> Mysql

Filtrer les entrées nulles ou vides à l'aide de LOAD DATA INFILE dans MySQL

Je ferais cela en filtrant le fichier avec grep ou awk puis le rediriger vers MySQL (via /dev/stdin ). Quelque chose comme ça :

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'expression régulière donnée à awk sur la deuxième ligne correspond à n'importe quelle ligne qui a un caractère de tabulation suivi d'un ou plusieurs de n'importe quel caractère. Vous voudrez peut-être l'adapter à vos besoins.

Modifier : Une autre possibilité m'est venue à l'esprit. Vous pouvez utiliser SET pour définir une valeur magique sur les colonnes vides et mettre un BEFORE INSERT déclencheur sur la table qui renfloue sur une ligne lorsqu'il voit cette valeur. Je n'ai pas beaucoup d'expérience avec les déclencheurs, mais je pense que quelque chose comme ça devrait fonctionner :

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
;

† : Selon la documentation :

Alors...

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

J'espère que cela vous sera utile !

Remarque 1 : Article de blog et commentaires pertinents
Remarque 2 : Fil SO pertinent