Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Filtruj puste lub puste dane wejściowe za pomocą LOAD DATA INFILE w MySQL

Zrobiłbym to, filtrując plik za pomocą grep lub awk a następnie wrzucenie go do MySQL (przez /dev/stdin ). Coś takiego:

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

Wyrażenie regularne podane do awk w drugim wierszu po prostu pasuje do dowolnego wiersza, który ma znak tabulacji, po którym następuje jeden lub więcej dowolnych znaków. Możesz dostosować go do swoich potrzeb.

Edytuj: Przyszła mi do głowy jeszcze jedna możliwość. Możesz użyć SET aby ustawić jakąś magiczną wartość w pustych kolumnach i umieścić BEFORE INSERT wyzwalacz na stole, który zwolni wiersz, gdy zobaczy tę wartość. Nie mam dużego doświadczenia z wyzwalaczami, ale myślę, że coś takiego powinno działać:

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
;

†: Zgodnie z dokumentacją :

Następnie...

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

Mam nadzieję, że to pomocne!

Uwaga 1: Trafny post i komentarze na blogu
Uwaga 2: Odpowiedni wątek SO




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL ORDER BY DESC jest szybki, ale ASC bardzo wolny

  2. Łącznik MySQL dla Pythona

  3. Zegar odliczający JavaScript i PHP, który wyświetla to samo dla wszystkich

  4. Żądanie wysłane przez klienta było niepoprawne składniowo przy użyciu @DateTimeFormat

  5. Błąd importowania Pythona MySQLdb — Mac 10.6