CSV-bestand kolom doorzoeken en weergeven

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

-- evilrabbit --

-- evilrabbit --

28/02/2018 08:55:15
Quote Anchor link
Hoi!

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$search
= 'Heliport';
if (($fp = fopen("data.csv", "r")) !== false) {
    while (($row = fgetcsv($fp)) !== false) {
        if($row[3] === $search) {
            echo 'Found ' . $row[3] . ': ' . $row[4] . ', ' . $row[5] . "\n";
        }
    }

    fclose($fp);
}

?>


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.
 
PHP hulp

PHP hulp

20/03/2019 23:20:18
 
Aad B

Aad B

28/02/2018 11:40:30
Quote Anchor link
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?
 
- Ariën -
Beheerder

- Ariën -

28/02/2018 11:48:12
Quote Anchor link
Is het niet een beetje tricky om je error-logging van Apache uit te besteden aan een ander proces, zoals MySQL? Want, als die op zijn gat gaat... wat doet de logging dan?

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.
 
Thomas van den Heuvel

Thomas van den Heuvel

28/02/2018 16:03:52
Quote Anchor link
- 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.
 
-- evilrabbit --

-- evilrabbit --

05/03/2018 05:55:44
Quote Anchor link
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?


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...
 
Jelmer -

Jelmer -

05/03/2018 09:34:34
Quote Anchor link
Volgens mij zou je het op twee manieren kunnen doen: of je maakt van iedere datum/tijd in het logbestand eerst een datum in PHP met DateTime, of je bouwt een string die overeenkomt met de dag die je zoekt en vergelijkt daar op.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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);
}


?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

$search_date
= date('d-m-Y ');

if (($fp = fopen("data.csv", "r")) !== false) {
    while (($row = fgetcsv($fp)) !== false) {
        if(strncmp($row[0], $search_date, strlen($search_date)) === 0) {
            echo 'Found ' . $row[3] . ': ' . $row[4] . ', ' . $row[5] . "\n";
        }
    }

    fclose($fp);
}


?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.