Raymond Flaar op 01/12/2017 23:14:46
Heb je enig idee hoe ik dit geautomatiseerd kan maken zodat dit zelf elke keer als er een nieuwe CSV file komt dit automatisch update ?
Dat wordt een leuke uitdaging. Gelukkig zit er wel enigszins een vast patroon in de bestanden.
Je zou een cronjob kunnen maken die regelmatig
deze rss uitleest. Het veld pubDate is in PHP om te zetten naar een DateTime object en biedt dus een methode om te zien of er een nieuw nieuwsbericht bijgekomen is. Dan kan je de titel scannen op "Diploma's" of "Examens" (Not sure welke jij wilt hebben). Indien dit keyword in de titel aanwezig is kun je de link volgen in het link veld. Hier zul je de HTML dan nog moeten scannen om de download link te vinden...
Omdat er ongetwijfeld wat onzekerheden in zitten zou ik een verslag genereren door de code en naar mijzelf laten mailen. Dan zou je in je mail kunnen lezen wat het laatste nieuws was en of er een bestand geimporteerd is.
[size=xsmall]
Toevoeging op 02/12/2017 11:48:21:[/size]
Nou omdat ik het wel leuk vond om te doen heb ik hier een opzetje voor je. Garantie tot aan de deur :-)
<?php
/*
* Functie om CSV bestanden uit te lezen
*/
function parseCSV($filename)
{
$row = 1;
if (($handle = fopen($filename, 'r')) !== FALSE) {
while (($data = fgetcsv($handle, 0, ';')) !== FALSE) {
// echo de array. Ga dit aanpassen en opslaan in je database.
echo '<pre>' . print_r($data, true ) . '<\pre>'; // even laten zien wat we nu hebben!
}
fclose($handle);
}
}
/*
* Deze functie tracht om van de gegeven url een download link te maken.
*
* van: Opleiderresultaten-1-oktober-2016-t/m-30-september-2017
* naar:
https://www.cbr.nl/download/opleiderresultaten_01102016_tm_30092017.csv
*/
function guessCBRDownloadLink($url)
{
$maanden = array('januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december');
// verkrijg de query string uit de url. Bijvoorbeeld id=1494&utm_source=rss&utm_medium=link&utm_campaign=Opleiderresultaten-1-oktober-2016-t/m-30-september-2017
parse_str(parse_url($url, PHP_URL_QUERY), $result);
// explode de variabele "Opleiderresultaten-1-oktober-2016-t/m-30-september-2017" op de "-" tekens
$words = explode('-', $result['utm_campaign']);
// zet nederlandse maanden om naar een getal. Bijvoorbeeld 'oktober' wordt 10.
$m1 = array_search($words[2], $maanden) + 1;
$m2 = array_search($words[6], $maanden) + 1;
// maak van de datums een DateTime object
$date1 = new DateTime($words[1] . '-' . $m1 . '-' . $words[3]);
$date2 = new DateTime($words[5] . '-' . $m2 . '-' . $words[7]);
// gebruik de DateTime objects om de download link te genereren
return 'https://
www.cbr.nl/download/opleiderresultaten_'; . $date1->format('dmY') . '_tm_' . $date2->format('dmY') . '.csv';
}
/*
* Begin met het inlezen van de RSS
*/
$xmlString= file_get_contents('https://
www.cbr.nl/downloadrss.pp?accountgroupid=1&categoryids=35';);
if(FALSE === $xmlString) {
throw new Exception('RSS feed kon niet gelezen worden.');
}
/*
* zet de inhoud van de RSS om in een XML object
*/
$xml = new SimpleXMLElement($xmlString);
/*
* Doorloop alle nieuwsberichten in de RSS
*/
foreach($xml->channel->item as $item) {
// pik de titels er tussen uit met het woord Opleiderresultaten.
if(FALSE !== strpos($item->title, 'Opleiderresultaten')) {
// sleutel de download link in elkaar voor het CSV bestand.
$csvFilename = guessCBRDownloadLink($item->link);
// Verwerk het CSV bestand
parseCSV($csvFilename);
// Nu dat we de nieuwste Opleiderresultaten verwerkt hebben zijn we niet meer benieuwd naar de oudere versies
break;
}
}
?>