Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Filtern Sie Null- oder leere Eingaben mit LOAD DATA INFILE in MySQL

Ich würde dies tun, indem ich die Datei mit grep filtere oder awk und es dann in MySQL weiterzuleiten (über /dev/stdin ). Etwa so:

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

Der an awk übergebene reguläre Ausdruck in der zweiten Zeile stimmt einfach mit jeder Zeile überein, die ein Tabulatorzeichen gefolgt von einem oder mehreren beliebigen Zeichen enthält. Vielleicht möchten Sie es an Ihre Bedürfnisse anpassen.

Bearbeiten: Eine andere Möglichkeit fiel mir ein. Sie könnten SET verwenden einen magischen Wert für leere Spalten zu setzen und ein BEFORE INSERT einzufügen Trigger für die Tabelle, die eine Zeile auslöst, wenn sie diesen Wert sieht. Ich habe nicht viel Erfahrung mit Triggern, aber ich denke, so etwas sollte funktionieren:

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
;

†: Pro Dokumentation :

Dann...

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

Hoffe es ist hilfreich!

Anmerkung 1: Relevanter Blogbeitrag und Kommentare
Anmerkung 2: Relevanter SO-Thread