Oprettelse af fødevaredatabase i MySQL

Efter uden held at have forsøgt at bruge dbmtools til at importere .mdb-filerne fra denne fødevaredatabase direkte ind i MySQL og forsøgt at bruge nogle af de andre XML-filerne til noget, prøvede jeg i stedet for at bruge mdb-export til at exportere til en cvs-filer.

Dette gav mig en fil for hver tabel med al data, men jeg måtte til at oprette alle tabellerne manuelt. Pyt – det går nok, jeg får jo stadig en hulens masse data forærerende, og jeg skal alligevel have redigeret en masse i tabellerne for at få dem tilpasset til det jeg skal bruge.

.mdb-database til CVS-filer

Der er følgende tabeller i den downloadede fødevaredatabase:
$ mdb-tables DKFoodComp701.mdb
Classif CompName FoodInfo GroupNames Nutrients References Sources

Det er umiddelbart ikke alle jeg nok skal bruge, men nu eksporterer jeg dem alle i tekst-format, og så ser jeg.

Jeg kører en mdb-export på alle tabllerne:
mdb-export DKFoodComp701.mdb Classif > classif.csv
mdb-export DKFoodComp701.mdb CompName > compname.csv
mdb-export DKFoodComp701.mdb FoodInfo > foodinfo.csv
mdb-export DKFoodComp701.mdb GroupNames > nuitrients.csv
mdb-export DKFoodComp701.mdb Nutrients > nutrients.csv
mdb-export DKFoodComp701.mdb References > references.csv
mdb-export DKFoodComp701.mdb Sources > sources.csv

Jeg fandt ud af at de danske bogstaver i min csv ikke blev vist rigtigt, og det er sikkert noget nemt man kan gøre med tegnsæt et sted, men da jeg ikke lige ved hvordan, kørte jeg i stedet for en search and replace på alle filerne på tegnene og så blev det problem også løst.

jed *.cvs
alt-x replace_across_buffer_files

æ med æ
ø med ø
Ã¥ med å
tab?

Der er vist et tabulator-tast der også bliver til mystisk tegn, men jeg lader den stå for nu.
(er der en smartere måde at få skiftet de der tegnsæt ud på, så smid gerne en kommentar her, jeg vil gerne vide det til anden god gang)

Oprettelse af tabellerne i MySQL

Tabellerne oprettes nu ud fra info fra filerne og min egen fantasi (“hvorfor har (du ikke)/gjorde (du ikke)” modtages gerne):

## klassifikationer
drop table if exists classif;
create table classif (
MainGrp integer not null,
SubGrp integer not null,
EngFdGp varchar(255),
OrigFdGp varchar(255),
primary key (MainGrp, SubGrp)
);

## komponenter
drop table if exists compname;
create table compname (
CompId integer not null,
SrtOrd integer not null,
Unit varchar(4),
CmpNamDK varchar(255),
CmpNamEN varchar(255),
PublStatus int(1),
EurofoodsTag varchar(63),
primary key (CompId)
);

## foodinfo
drop table if exists foodnfo;
create table foodinfo (
FoodId integer not null,
DanName varchar(255),
ProdName varchar(63),
EngName varchar(63),
SysName varchar(63),
MainGrp integer not null,
SubGrp integer not null,
Waste integer,
NCF float,
FACF float,
PEF float,
FEF float,
CEF float,
Density float,
Remarks varchar(255),
PublStatus int(1),
LanguaL varchar(255),
GRIN varchar(255),
FISHBASE varchar(255),
BASIS varchar(255),
USDA varchar(255),
FIFood varchar(255),
UKFood varchar(255),
FRFood varchar(255),
DEFood varchar(255),
SEFood varchar(255),
NOFood varchar(255),
NLFood varchar(255),
ISFood varchar(255),
SPFood varchar(255),
ITFood varchar(255),
DateUpdated timestamp,
UpdatedBy varchar(255),
Recipe varchar(255),
WaterYield integer,
FatYield integer,
primary key (FoodId),
foreign key (MainGrp) references classif,
foreign key (SubGrp) references classif
);

## Nutrients
drop table if exists nutrients;
create table nutrients (
FoodId integer not null,
CompId integer not null,
BestLoc float,
Median float,
Minimum float,
Maximum float,
NoAnal float,
SourceId integer,
primary key (FoodId, CompId),
foreign key (FoodId) references foodinfo,
foreign key (CompId) references compname
);

Import af data fra CVS til MySQL-tabellerne

load data local infile ‘classif.csv’ into table classif fields terminated by ‘,’
enclosed by ‘”‘
lines terminated by ‘\n’
(MainGrp, SubGrp, EngFdGp, OrigFdGp);

#Query OK, 135 rows affected, 19 warnings (0.00 sec)
#Records: 149 Deleted: 0 Skipped: 14 Warnings: 0

load data local infile ‘compname.csv’ into table compname fields terminated by ‘,’
enclosed by ‘”‘
lines terminated by ‘\n’
(CompId, SrtOrd, Unit, CmpNamDK, CmpNamEn, PublStatus, EurofoodsTag);

#Query OK, 112 rows affected, 1 warning (0.00 sec)
#Records: 112 Deleted: 0 Skipped: 0 Warnings: 1

load data local infile ‘foodinfo.csv’ into table foodinfo fields terminated by ‘,’
enclosed by ‘”‘
lines terminated by ‘\n’
(FoodId,DanName,ProdName,EngName,SysName,MainGrp,SubGrp,Waste,NCF,FACF,PEF,FEF,CEF,Density,Remarks,PublStatus,LanguaL,GRIN,FISHBASE,BASIS,USDA,FIFood,UKFood,FRFood,DEFood,SEFood,NOFood,NLFood,ISFood,SPFood,ITFood,DateUpdated,UpdatedBy,Recipe,WaterYield,FatYield);

#Query OK, 0 rows affected, 9438 warnings (0.01 sec)
#Records: 1049 Deleted: 0 Skipped: 1049 Warnings: 3131

load data local infile ‘nutrients.csv’ into table nutrients fields terminated by ‘,’
enclosed by ‘”‘
lines terminated by ‘\n’
(FoodId, CompId, BestLoc, Median, Minimum, Maximum, NoAnal, SourceId);

#Query OK, 75900 rows affected, 65535 warnings (0.31 sec)
#Records: 75982 Deleted: 0 Skipped: 82 Warnings: 172505

Tilbage er references og sources som indeholder referencer til kilder og publikationer. Den springer jeg over for nu …

Jeg har godt nok fået en hulens masse warnings og de fleste handler om at et af de der float-felter er blevet trunkeret. Warnings kommer vist når feltet er tomt, men jeg kan ikke helt finde rundt i om det har nogen betydning for mig pt.

Og hvad så?

Foodinfo, compname og nutrients er de mest relevante tabller.

  • Foodinfo indeholder info om alle fødevarerne og er kategoriseret – det er her pt kun hovedgruppe 5 & 6 jeg skal bruge (frugt og grønt).
  • Compname indeholder data om de forskellige bestandsdele, såsom proteiner, kulhydrater, fedt, vitaminer og mineraler … og alt det der.
  • Nutrients kobler de to ovenstående tabeller sammen og indeholder gennemsnits-, minimum- og maksimum-værdier for de forskellige bestandsdele i de forskellige fødevarer.

Nu roder jeg lidt videre med indholdet og tilpasser og ser på hvad og hvordan jeg vil skrive det ud til mit online frugt- og grønt-projekt … lige om lidt, skal lige lege lidt mor også for at have balance i regnskabet.

Fortsættelse følger.