2017-08-20 3 views
-2

Donc, j'ai un fichier .txt plein de données d'utilisations d'un programme sur mon site. Le format est le suivant:Comment formater une chaîne de données spécifique en PHP?

~input|methodUsed|User|userInfo|month|day|year|hour|minute\n 

Chaque fois que quelqu'un utilise le programme, il ajoute cette ligne au fichier texte. Je travaille sur une page de statistiques. Je me demande trois choses:

Comment gérer la chaîne des entrées (en utilisant file_get_contents) à:

Obtenez les utilisations dans une journée spécifique (par exemple 08|17|17)

En ce jour-là, obtenir le le plus commun utilisateur et/ou entrée

et dans l'ensemble, obtenir l'utilisateur le plus courant et/ou entrée

Je suppose que la différence de code entre trouver le plus commun utilisateur et l'entrée la plus commune est guère. Quelqu'un peut-il m'aider à accomplir l'une ou l'autre de ces trois tâches en PHP? Je suis conscient de la fonction explode() de PHP et suppose que c'est nécessaire pour terminer cette tâche. Je sais que cette façon de gérer les données n'est pas la meilleure, mais je ne veux vraiment pas la changer. J'ai des mois de données stockés de cette façon. Si je n'ai pas ajouté les informations nécessaires pour terminer la tâche, veuillez me le faire savoir.

+0

trop large. Isolez votre problème. Montrez votre tentative de codage. Montrer quelques exemples d'entrée. – mickmackusa

+1

Utilisez une base de données, même temporairement, avec LOAD DATA INFILE - pour faire de cette pratique sans grandes quantités de code. – mario

Répondre

1

Comme le suggérait Mario, vous pouviez facilement mettre les données dans une base de données, et il serait très simple d'obtenir les statistiques que vous recherchez. Je vais vous montrer un exemple de cela avec une base de données SQLite3.

D'abord, vous voudriez importer vos données. Vous pouvez utiliser file_get_contents, mais parce que je devais tester cela, je viens importé d'une chaîne, et parce que je ne sais pas ce que vos données ressemble vraiment, je viens de l'inventer:

$db = new SQLite3(__DIR__ . '/logs.db'); 
$db->exec(' 
    CREATE TABLE log (
     input TEXT, 
     methodUsed TEXT, 
     User TEXT, 
     userInfo TEXT, 
     datetime TEXT 
    ) 
'); 

$str = "~a|3|Bob|aaa|12|04|2000|23|05\n 
~b|6|Bill|bbb|08|18|2017|14|18\n 
~c|4|Tina|ccc|09|28|2016|16|33\n 
~d|7|Doug|ddd|11|07|2017|08|24\n 
~e|1|Fred|eee|01|22|2015|00|16\n"; 

// Get an array of lines 
$lines = explode(PHP_EOL, $str); 

// Loop through the lines 
foreach($lines as $line) 
{ 
    if(! empty($line)) 
    { 
     list(
      $input, 
      $methodUsed, 
      $User, 
      $userInfo, 
      $month, 
      $day, 
      $year, 
      $hour, 
      $minute 
     ) = explode('|', $line); 

     $dateTime = date('Y-m-d H:i:s', strtotime($year . '/' . $month . '/' . $day . ' ' . $hour . ':' . $minute . ':00')); 

     $db->exec(" 
      INSERT INTO log (input, methodUsed, User, userInfo, datetime) 
      VALUES (\"$input\",\"$methodUsed\",\"$User\",\"$userInfo\",\"$dateTime\") 
     "); 
    } 
} 

Maintenant que il y a une base de données avec des données, il est vraiment facile de faire les requêtes pour vous donner les statistiques que vous voulez. Vous obtenez une connexion à nouveau:

$db = new SQLite3(__DIR__ . '/logs.db'); 

Ce juste sélectionne tous les utilisateurs dans chaque ligne

$results = $db->query('SELECT User FROM log'); 

Ceci permet de sélectionner tous de toutes les lignes où la datetime est au cours des 6 derniers mois

$results = $db->query('SELECT * FROM log WHERE datetime > datetime("now", "-6 months")'); 

Ceci sélectionne toutes les lignes où se trouve le datetime un jour spécifique

$results = $db->query('SELECT * FROM log WHERE date(datetime) = "2017-08-18"'); 

Accéder à un utilisateur le plus commun un jour spécifique

$results = $db->query('SELECT User, COUNT(*) as cnt FROM log WHERE date(datetime) = "2017-08-18" GROUP BY User ORDER BY cnt DESC LIMIT 1'); 

Obtenez l'utilisateur le plus commun de tous les enregistrements

$results = $db->query('SELECT *, COUNT(*) as cnt FROM log GROUP BY User ORDER BY cnt LIMIT 1'); 

Enfin, afficher les résultats de l'un des résultats ci-dessus (choisissez 1 à un moment):

while($row = $results->fetchArray(SQLITE3_ASSOC)) 
{ 
    echo '<pre>'; 
    print_r($row); 
    echo '</pre>'; 
} 

Je suis sûr que vous voulez faire vos propres modifications, ou peut-être utiliser une base de données MySQL à la place (ce qui est ce que je ferais), mais cela devrait vous aider à démarrer.J'ai testé ce code, il devrait donc répondre à vos besoins, si vous envisagez ce genre de chose.

+0

Merci! Cela a fonctionné à merveille ... J'edited une partie du code pour le faire fonctionner pour mes données (comme mon année est « 17 » et non « 2017 », donc je devais ajouter un 20 devant la variable d'année pour le faire maintenant montrer la date AS1 Janvier 1970. Je compris comment ajouter de nouvelles données à la base de données existante, mais je me demandais une chose. Comment pourrais-je compter le nombre d'utilisations en un jour? @brianGottier –

+0

Peu importe, j'ai trouvé un question différente avec cette réponse Mon script de statistiques fonctionne parfaitement maintenant, merci encore. –