Fejléces .csv fájl beolvasása sqlite adattáblába

Sokáig ügyeskedtem azzal, hogy egy fejléccel rendelkező .csv fájlt hogy érdemes sqlite adattáblába olvasni. Csináltam táblagyártó szkriptet így-úgy-amúgy, megoldottam a fájl fejlécsorának az adatok közül való kiküszöbölését (tail -n +2)... míg aztán rájöttem, hogy erre már van kész eszköz. Csak nem úgy hívják, hogy sqlite, hanem úgy, hogy spatialite; de ugyanazzal az sqlite adatbázissal tud bánni (parancssorból vagy qui felületen).

http://sqlite.1065341.n5.nabble.com/How-do-you-load-a-csv-and-skip-the-…

CREATE VIRTUAL TABLE virt_table USING VirtualText(file, ISO-8859-2, 1, TAB, DOUBLEQUOTE, " ");

Igaz ugyan, hogy ez felvesz egy kéretlen ROWNO oszlopot, de ezt lehet törölni, másrészt meg nem sok vizet zavar. Ez első körben egy csak-olvasható tábla lesz, de create table vmi as select * révén át lehet mindent tölteni egy teljes értékű, írható-törölhető táblába.

Vigyázz! Az ISO-8859-2-es kódolású karaktereket kérdezés nélkül UTF-8-asra alakítja a spatialite! (Az üres cellaértékeket meg NULL-á).

Egy hasonló megoldást kínál az apsw (another Python SQLite 3 wrapper) autoimportja: http://apidoc.apsw.googlecode.com/hg/shell.html

Hozzászólások

Ha esetleg a grafikus környezetet preferálja valaki, akkor a KNIME, vagy a RapidMiner is jó -ingyenes, open source- alternatíva lehet. Parancssorban pedig az R szintén népszerű.

Ket kerdes:

- A spatialite-nak csak az extension-jet vagy a CLI cuccat is hasznaltad?
- A vegeredmeny normal sqlite3 adatbazis lesz, vagy csak a spatialite eszi meg onnantol?
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. 

A spatialite-öt simán "alapállapotában" (azaz pl. Ubuntuban apt-get install spatialite-bin után kapott állapotában) hívtam meg parancssorból, adatbázisnévvel:
spatialite db1
spatialite> CREATE VIRTUAL TABLE virt1 USING VirtualText(myfile, ISO-8859-2, 1, TAB, DOUBLEQUOTE, " ");
spatialite> CREATE TABLE t1 AS select * from virt1;

A végeredményként kialakuló "db1" adatbázist meg tudom hívni simán sqlite3-mal is.
Azonban csak az "átalakított" táblát (t1) ismeri föl, a "beolvasóst" nem:

sqlite> select * from virt1;
Error: no such module: VirtualText
sqlite> select * from t1 limit 1;
0|45947991|K3999937|22000|2|22795|EGYN|3||XTO

Becsületére legyen mondva, hogy típushelyesek az oszlopok; azaz ott van szám, ahol annak van a helye:

CREATE TABLE t1(
ROWNO INT, ez INT, az TEXT, acc INT, seq INT, prd TEXT, pwy TEXT, rnd INT, off TEXT, cat TEXT
);