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