sql >> Database >  >> RDS >> Mysql

Filter null of lege invoer met LOAD DATA INFILE in MySQL

Ik zou dit doen door het bestand te filteren met grep of awk en vervolgens doorverwijzen naar MySQL (via /dev/stdin ). Zoiets als dit:

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

De reguliere expressie gegeven aan awk op de tweede regel komt gewoon overeen met elke regel met een tab-teken gevolgd door een of meer van een willekeurig teken. Misschien wilt u het aanpassen aan uw behoeften.

Bewerken: Er kwam nog een andere mogelijkheid bij me op. Je zou SET . kunnen gebruiken om een ​​magische waarde in te stellen op kolommen die leeg zijn en plaats een BEFORE INSERT trigger op de tafel die op een rij springt als hij die waarde ziet. Ik heb niet veel ervaring met triggers, maar ik denk dat zoiets zou moeten werken:

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
;

†: Volgens de documenten :

Dan...

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

Ik hoop dat het nuttig is!

Opmerking 1: Relevante blogpost en reacties
Opmerking 2: Relevante SO-thread




  1. Invoegen in één tabelbasis op samenvoegresultaat van 2 andere tabellen

  2. Codeigniter Select_Sum geeft array geen numerieke waarde?

  3. Hoe MySQL-resultaten sorteren met letters eerst, symbolen als laatste?

  4. MySQL:automatisch verhogen met alleen even of oneven getallen?