уже есть хорошие идеи для структурированной версии вашей целевой модели данных - если вы хотите, чтобы структура вашей статистики была немного более гибкой, но при этом вы могли со временем разбивать и группировать, то альтернативой может быть следованиеШаблон / dw для моделирования ваших данных
следующие «логические» и будут коррелировать с атрибутами / измерениями в таблице фактов согласно kimball et.al. , где 'зерном' таблицы фактов является 'src html file + table + row + cell + value (s)', при условии, что ваши значения согласованы во времени
(я заметил на вашем изображении, что есть пара таблиц для одного HTML-файла и несколько значений в каждой ячейке)
group_srcfile
(указывает на местоположение висходный html-файл / таблица / строка / ячейка, и, возможно, вы также можете сохранить исходный html-файл на случай, если позже потребуется выполнить вскрытие)
group_cohort
(указывает нанормализованная когорта, например, «18-24 лет в возрасте» или «мужчины в течение времени»)
group_question
(указывает на определение вопроса - это все те же вопросы со временем)
question_id
(определение вопроса + год вопроса)
question_year
(это год, когда был задан вопрос)
cohort_start_year
(это год, в котором когорте задавался вопрос)
cohort_end_year
(это конецгодКогорту задавали вопрос)
cohort_start_age
(если применимо, будет нормализовано 'xxxx - yyyy', например: '18')
cohort_end_age
(это либо указано, либо выведено как «xxxx - present», где «present» - это год файла отчета html)
значения 1.. n должны считать одни и те же вещи, в противном случае вам нужно будет их также разделить
, чтобы получить достойный результат, вам нужно будет завершить вопросы по вашим даннымтаблицу, но что бы вы ни делали, было бы относительно просто экспортировать html с использованием php
. Я подумал о методе загрузки данных в mysql, но без твердых примеров html-файлов, являющихся источникомваши данные, трудно написать конкретный код (т.е.откройте в вашем браузере и «просмотреть исходный код» или эквивалентный)
в качестве общего подхода, я бы проанализировал каждый факт (ячейка таблицы td
) из html, используя php и DOMDocument
, а затем выдал строку вденормализованная форма для последующей загрузки в промежуточную таблицу и, в конечном счете, в вашу таблицу фактов
в этом контексте, 'emit' является источником того, что в конечном итоге становится отдельной строкой в вашей таблице фактов, но вы пока не можете ее загрузитьпотому что вы не знаете, какими будут ваши ключи измерения, если вы не определите их во время анализа html
, это практически невозможно сделать: вместо этого загрузите в свободно определенную таблицу (без ссылки на целостность)и как только вы закончите анализ всех файлов, напишите etl или запросы, которые сгенерируют ваши таблицы измерений, прежде чем закончить с вашими фактами
(я бы, вероятно, использовал интеграция данных pentaho для обработки второгофаза - потоковый анализатор XML не может обработать первый: слишком строго)
я нашел этот тест html file , который был достаточно стар, чтобы заставить меня пойти и выпить свой последний кофе при одной мысли о бесконечной переписывании кода очистки, чтобы учесть бесконечные изменения макета, любезно предоставленные «dreamtheaver» ...
Как только мои руки достаточно стабилизировались, и кровоток вернулся к нормальному состоянию, я направил машинный дух и произвел следующий php - заметно отсутствует какой-либо вид реструктуризации / денормализации исходной таблицы:
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$dom = new DOMDocument();
$srcfile = 'testxmlparser.html';
$dom->loadHTMLFile( $srcfile, NULL );
echo 'odom is: ' . ($dom ? 'nice':'naughty') . PHP_EOL;
if( $dom ) {
// get all the table rows in the document
$tblrows = $dom->getElementsByTagName('tr');
foreach( $tblrows as $trrow ) {
$tblcells = $trrow->getElementsByTagName('td');
$incr = 0;
// buffer this table row's cell (td) data that we encounter, in case it is interesting...
$srowbuf = '';
foreach( $tblcells as $tdcell ) {
$srowbuf = ($srowbuf . $tdcell->nodeValue);
if( 1 <= $incr++ )
$srowbuf = ($srowbuf . '+|');
}
// we know the table data we're interested in has 12 cells only
if( 12 == $incr )
echo $srowbuf . '+|' . $incr . '+|' . $srcfile . PHP_EOL;
}
}
?>