sql >> Databasteknik >  >> RDS >> Mysql

Filtrera null eller tom indata med LOAD DATA INFILE i MySQL

Jag skulle göra detta genom att filtrera filen med grep eller awk och sedan överföra det till MySQL (via /dev/stdin ). Något så här:

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

Det reguljära uttrycket som ges till awk på den andra raden matchar bara en rad som har ett tabbtecken följt av ett eller flera tecken. Du kanske vill justera den för att passa dina behov.

Redigera: En annan möjlighet uppstod för mig. Du kan använda SET för att ställa in något magiskt värde på kolumner som är tomma och sätta en BEFORE INSERT trigger på bordet som kommer att lösas på en rad när den ser det värdet. Jag har inte så mycket erfarenhet av triggers men jag tror att något sådant här borde fungera:

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
;

†: Enligt dokumenten :

Sedan...

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

Hoppas det är till hjälp!

Obs 1: Relevanta blogginlägg och kommentarer
Obs 2: Relevant SO-tråd




  1. skapa en mysql-tabell från en inre join

  2. Hur skapar jag en användare med samma privilegier som root i MySQL/MariaDB?

  3. PHP Fatalt fel:Ofångad PDOException:kunde inte hitta drivrutinen

  4. SQL INSERT-syntax – listad av DBMS