Avatar billede natsortsort Nybegynder
03. februar 2010 - 22:29 Der er 4 kommentarer og
1 løsning

textfil log til tabel

Jeg har en textfil som er en log over aktiviteter på formen:

Sun, 27 Dec 2009 16:26:17 +0100    194.182.25.xx      /Sonic studio.jjj
Thu, 21 Jan 2010 17:50:55 +0100    62.44.134.xx    /Sonic studio.jjj
Thu, 21 Jan 2010 17:52:50 +0100    194.182.251.xx    /Sonic studio.jjj
Thu, 22 Jan 2010 18:07:27 +0100    194.182.251.xx    /Sonic studio.jjj
Thu, 23 Jan 2010 18:20:37 +0100    212.17.144.xxx    /Sonic studio.jjj

Jeg vil gerne lave en tabel der opsummerer etries pr. dato. og er kommet frem til

Kan åbne filen via $myFile = "http://x.prtpl.com/count/log.txt";

$fh = fopen($myFile, 'r');
$theData = fgets($fh);
while(!feof($fh))
{    $data .= fgets($fh, 4096);}


Og har fået splittet hver enkelt linie op via:

$values = explode(" ", $data);
Som desværre ikke helt perfekt, da hver linie rummer inkonsistente mellem.

Men basalt set er de vigtigste værdier i udskriften
(Day) 27,21,21,22,23
(Month) Dec,Jan,jan,jan,jan
(Year) 2009,2010, 2010,2010,2010

Det jeg gerne vil, er at lave en tabel, er opsummerer antal downloads pr. dag.

Nogen ideer til hvordan det kan løses?

NB. filen er meget stor rummer over 20.000 rækker
Avatar billede mikaelbaek Nybegynder
03. februar 2010 - 23:13 #1
hmm... ja hvis jeg forstår spørgsmålet korrekt vil du gerne have en tabel der viser dig en liste over antal downloads. Men skal de downloads være fordelt på IP, Dato eller klokkeslet?

Umiddelbart kunne du vidst med fordel kaste nogle regulære udtryk efter din læsning for at samle nogle værdier. Men det mest effektive ville være at hælde værdierne i en database af en art. Access, MySQL eller lign, noget du efterfølgende kunne kaste SQL i for at aflæse forskellige fordelinger af dine downloads.

Så med mindre du er efter en ganske speciel fordeling af data som du vil repræsentere i din tabel, så skal det data du har hældes i noget andet brugbart.

/Mikael
Avatar billede intenz Novice
03. februar 2010 - 23:16 #2
Det smarte ville være, at sætte dataet ind i en database når du har trukket det ud. Og så køre dine antal pr. dag/måned/år osv direkte i databasen. Det er langt mere effektivt og du vil så kun skulle behandle tekstfilen en gang. Og ikke kører 20.000 igennem hver gang.

Når det er sagt, så ser koden du skal bruge til det du spørger om sådan her ud. Nogle ting kan måske optimeres, men det virker :)

Den første del, trækker dataet ud af filen og sætter det i et array. Den anden del behandler dataet og udregner antal pr. dag/måned/år (i arrays).


<?php
$myFile = "http://x.prtpl.com/count/log.txt";
$fh = fopen($myFile, 'r');
$theData = fgets($fh);
$count = 0;
while(!feof($fh)) {
    $thisLine = fgets($fh, 4096);
   
    // find position på /, for at vide hvor filen står
    $filePos = strpos($thisLine, '/', 32);
   
    // find de forskellige værdier
    $date = substr($thisLine, 0, 31);
    $ip = trim(substr($thisLine, 32, ($filePos-32)));
    $file = trim(substr($thisLine, $filePos));
   
    $data[$count]['date'] = $date;
    $data[$count]['ip'] = $ip;
    $data[$count]['file'] = $file;
    $count++;
}

//print_r($data);

// beregn totaler
$day_total = array();
$month_total = array();
$year_total = array();

foreach($data as $value) {
    $timestamp = strtotime($value['date']);
    $day = date("d/m/Y", $timestamp);
    $month = date("m/Y", $timestamp);
    $year = date("Y", $timestamp);
   
    $day_total[$day] = (isset($day_total[$day])) ? $day_total[$day]+1 : 1;
    $month_total[$month] = (isset($month_total[$month])) ? $month_total[$month]+1 : 1;
    $year_total[$year] = (isset($year_total[$year])) ? $year_total[$year]+1 : 1;
}

print_r($day_total);
print_r($month_total);
print_r($year_total);
?>
Avatar billede natsortsort Nybegynder
03. februar 2010 - 23:20 #3
Intenz - lige hvad jeg skulle bruge.
Jeg er godt klar over at det er letter i en database, men da filen ændrer sig løbende, foretrækkes jeg denne fremgangsmåde...

lave du et svar?
Avatar billede intenz Novice
03. februar 2010 - 23:25 #4
Har jeg allerede gjort.
Ideen med databasen kan du jo bare indsætte det i databasen og derfor slette indholdet af filen, så den er tom igen.
Men det må du selv om :)
Avatar billede natsortsort Nybegynder
04. februar 2010 - 14:14 #5
@intenz:Jeg vil jo gerne kunne indsætte det array som du lavede ovenfor i en tabel:

dato => værdi.

Jeg har fundet ud af følgende, men kan kun finde ud af indsætte selve værdien af $day_total.
Hvordan får jeg trukket den pågældende mærkat ud også (27/11/2009) ?+

$day_total_values = array_values($day_total);

$r=0;   
while ($r < 10) {
echo "<td> dag</td>";
echo "<td>".$day_total_values[$r]."</td> </tr>";

$r++;}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester