CSV-bestand kolom doorzoeken en weergeven
Ik heb een error_log.csv bestand dat ik waarin ik de eerste kolom met datum en tijd wil doorzoeken, zodat ik de errors met details van die bepaalde datum kan weergeven.
Ik heb al heel wat geprobeerd. Ik baseerde mij op deze werkende code:
Code (php)
Mijn error_log.csv heeft als indeling:
"06-01-2017 13:57:11", "type error", "bestandslocatie", "lijnnummer"
Samengevat wil ik dus de volledige rij weergeven waarvan de datum en tijd matcht met de gevraagde datum.
Wie heeft er een idee? Alvast bedankt om mee na te denken.
http://dasunhegoda.com/apache-access-logs-to-mysql-database/953/
Maakt geindexeerd snel zoeken mogelijk een scheelt veel programmeerwerk.
Je huidige code: Werkt het niet? Welke foutmeldingen krijg je?
En hoe vaak moet je nou in een error_log spitten? Met grep en tail kan je al prima rondneuzen in een dergelijk bestand. Met zoeken met grep kan soms even enkele tellen duren, maar een error_log lijkt mij puur alleen voor debuggen.
- Ariën - op 28/02/2018 11:48:12:
En hoe vaak moet je nou in een error_log spitten?
Vaker dan je denkt. In productie-omgevingen zijn errorlogs vaak je (enige) vriend.
- Ariën - op 28/02/2018 11:48:12:
Met grep en tail kan je al prima rondneuzen in een dergelijk bestand.
Niet iedereen heeft unix-knowhow, of shell access, for that matter.
ontopic:
Quote:
Ik heb een error_log.csv bestand dat ik waarin ik de eerste kolom met datum en tijd wil doorzoeken, zodat ik de errors met details van die bepaalde datum kan weergeven.
Dit wordt een beetje lastig als het datumformaat van jouw beschreven indeling daadwerkelijk dd-mm-jjjj uu:mm:ss is. Het zou een ander verhaal zijn als het datumformaat jjjj-mm-dd uu:mm:ss is. In dit laatste geval zou dit een stuk eenvoudiger zijn omdat dat datumformaat (wat overigens een standaard is, dit in tegenstelling tot dd-mm-jjjj...) een alfabetische sortering volgt. Het enige wat je in dat geval nodig hebt is een interval A t/m B waarin je geïnteresseerd bent.
Mijn eerste vraag is dus eigenlijk: hoe luidt een exacte timestamp (het datumformaat) in deze errorlog? Als dit niet jjjj-mm-dd is is dat ook geen ramp, maar dan heb je wat meer code nodig om te kunnen rekenen met deze datums.
Aad B op 28/02/2018 11:40:30:
Misschien interessant om je apache webserver meteen in MySQL te loggen?
http://dasunhegoda.com/apache-access-logs-to-mysql-database/953/
Maakt geindexeerd snel zoeken mogelijk een scheelt veel programmeerwerk.
Je huidige code: Werkt het niet? Welke foutmeldingen krijg je?
http://dasunhegoda.com/apache-access-logs-to-mysql-database/953/
Maakt geindexeerd snel zoeken mogelijk een scheelt veel programmeerwerk.
Je huidige code: Werkt het niet? Welke foutmeldingen krijg je?
De meeste errors die worden weggeschreven naar het CSV-bestand zijn fouten die zich voordoen in de database. In dit geval lijkt het mij dus niet verstandig om het CSV naar een DB over te zetten.
Anders zou dit idd een oplossing kunnen zijn...
Bij idee 1 kan je echt een datum-range meegeven, en maakt het niet zoveel uit in welk formaat de datum in je foutmeldingen wordt weggeschreven, zo lang PHP het maar herkent:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
function is_between($field, $from, $till) {
$date = new DateTime($field);
return $date >= $from && $date <= $till;
}
// Geen idee hoe je makkelijker vandaag, 0:00 krijgt… hoeft ook niet, je kan willekeurige bereiken zoeken
$today = new DateTime((new DateTime())->format('Y-m-d 00:00:00'));
$tomorrow = clone $today;
$tomorrow->modify('+1 day');
if (($fp = fopen("data.csv", "r")) !== false) {
while (($row = fgetcsv($fp)) !== false) {
if(is_between($row[0], $today, $tomorrow)) {
echo 'Found ' . $row[3] . ': ' . $row[4] . ', ' . $row[5] . "\n";
}
}
fclose($fp);
}
?>
function is_between($field, $from, $till) {
$date = new DateTime($field);
return $date >= $from && $date <= $till;
}
// Geen idee hoe je makkelijker vandaag, 0:00 krijgt… hoeft ook niet, je kan willekeurige bereiken zoeken
$today = new DateTime((new DateTime())->format('Y-m-d 00:00:00'));
$tomorrow = clone $today;
$tomorrow->modify('+1 day');
if (($fp = fopen("data.csv", "r")) !== false) {
while (($row = fgetcsv($fp)) !== false) {
if(is_between($row[0], $today, $tomorrow)) {
echo 'Found ' . $row[3] . ': ' . $row[4] . ', ' . $row[5] . "\n";
}
}
fclose($fp);
}
?>
Idee 2 is sneller, want je hoeft niet alle data te parsen. Nadeel is dat je maar op één dag kan zoeken, en niet op een tijd-range
Code (php)