Porovnání záznamů v MySQL tabulce s daty v souboru
- 19. Leden 2010
- Publikováno v MySQL
- Napište komentář
Napsal jsem si skriptík, který z textového souboru načítá jednotlivé řádky a následně je zpracuje a uloží do databáze. Vše by bylo pěkné, kdyby v onom skriptu nebyla chyba, kvůli které nebyly některé řádky zpracované. Vzhledem k tomu, že zpracovávání všech údajů zabralo pár hodin, tak opětovné spuštění skriptu na všechna data nepřipadalo v úvahu. Bylo třeba zjistit, které záznamy byly zpracovány a které ne. Po chvilce hledání jsem usoudil, že jedním (byť složeným) dotazem to nezjistím. Byly potřeba tři.
Pro demonstraci použiji jen pár záznamů, aby byl vidět výsledek.
V souboru data.txt jsou tyto údaje: dum auto zidle vana skrin stul dvere podlaha okno strecha balkon. Každé slovo na novém řádku.
Do tabulky se uložily údaje o některých těchto slovech:
+----+---------+
| id | slovo |
+----+---------+
| 1 | dum |
| 2 | auto |
| 3 | zidle |
| 4 | stul |
| 5 | dvere |
| 6 | okno |
| 7 | strecha |
+----+---------+
7 rows in SET (0.00 sec)
Teoretické řešení je jednoduché. Porovnat zdrojový soubor s daty a vypsat všechny řádky, které nejsou obsaženy v tabulce data. Praktické řešení pokulhává na tom, že jsem nenašel způsob, jak načíst data z textového souboru a přímo s nimi pracovat. I bez toho je však řešení celkem jednoduché.
Nejdříve si vytvořím dočasnou tabulku. Do té načtu obsah datového souboru a nakonec jen porovnám záznamy v tabulce data s daty v dočasné tabulce.
Query OK, 0 rows affected (0.00 sec)
mysql> LOAD DATA INFILE '/tmp/data.txt' INTO TABLE t;
Query OK, 11 rows affected (0.00 sec)
Records: 11 Deleted: 0 Skipped: 0 WARNINGS: 0
mysql> SELECT t.s FROM t
-> WHERE s NOT IN (SELECT slovo FROM data);
+---------+
| s |
+---------+
| vana |
| skrin |
| podlaha |
| balkon |
+---------+
4 rows in SET (0.06 sec)
Abych mohl výstup použít pro další zpracování, je vhodné jej uložit zpátky do textového souboru.
-> FROM t
-> WHERE s NOT IN
-> (SELECT slovo FROM data);
Query OK, 4 rows affected (0.00 sec)
Obsah souboru vystup.txt:
vana
skrin
podlaha
balkon
Může se stát, že vám MySQL vypíše chybu:
ERROR 1 (HY000): Can't create/write to file 'xzy.tx' (Errcode: 13)
V tom případě použijte adresář, do kterého může mysql zapisovat. V linuxu například /tmp.
Na závěr neuškodí, dočasnou tabulku smazat.
Query OK, 0 rows affected (0.00 sec)
Dosud žádný komentář.