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