PHP подсчитывает количество строк текстового файла на основе даты и времени - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть данные журнала в текстовом файле (.txt)

Данные в текстовом файле примерно такие:

City Siren FCT_Tester #1 10039273
Date: 160518, Version: 1.00             

ID  Test                                                Min Max Unit
1   Battery level                           2.85    3.40    V
2   Piezo sound level                           1.45    2.80    V   
3   Left D3  (Ch 3) light intensity                                 2000     
10000   mcd
4   Right D2  (Ch 1) light intensity                            2000     
10000   mcd

Date    Time    Battery level                           Piezo sound level                            
Left D3  (Ch 3) light intensity                                 Right D2  
(Ch 1) light intensity                          

Wed, Sep 19  2018   06:47:01    3.372   1.621   9117.000    7303.300
Wed, Sep 19  2018   06:47:19    3.374   1.614   8614.400    7152.300
Wed, Sep 19  2018   08:08:04    3.378   1.604   9586.500    7422.400
Wed, Sep 19  2018   08:08:20    3.375   1.632   9249.300    6682.200
Wed, Sep 19  2018   08:08:44    3.377   1.615   9059.700    6777.100
Wed, Sep 19  2018   08:09:15    3.376   1.626   8902.500    6962.200

Я сделал следующее:

echo count(file($files));

Он получит все строки.

Итак, мой вопрос, я хочу посчитать строки текстового файла с условием из даты и времени.Получите счет Wed, Sep 19 2018 08:00:00 до Wed, Sep 19 2018 11:00:00

Таким образом, результат должен быть: 4

Возможно ли это?

ОБНОВЛЕНИЕ
Файл журнала используетвкладка, то код может «прочитать с ошибкой:

Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string

ниже находится файл журнала

Tue, Sep 18  2018   23:59:53    3.380   1.622   9958.500    7301.000
Wed, Sep 19  2018   00:00:08    3.380   1.622   8817.900    7194.800
Wed, Sep 19  2018   00:00:28    3.343   1.598   9089.500    7033.800
Wed, Sep 19  2018   00:00:45    3.376   1.602   8789.200    7285.200
Wed, Sep 19  2018   00:01:01    3.376   1.629   8406.000    7295.700
Wed, Sep 19  2018   00:01:17    3.378   1.623   8468.100    7382.800
Wed, Sep 19  2018   00:01:36    3.366   1.619   9462.900    7200.600
Wed, Sep 19  2018   00:01:54    3.370   1.622   9389.700    7018.500
Wed, Sep 19  2018   00:02:21    3.375   1.582   9637.100    7347.500
Wed, Sep 19  2018   00:02:36    3.377   1.595   8775.200    7414.700
Wed, Sep 19  2018   00:02:52    3.340   1.585   8955.300    7376.700
Wed, Sep 19  2018   00:03:20    3.263   1.600   8325.900    6694.700
Wed, Sep 19  2018   00:03:37    3.369   1.616   9554.400    7045.700

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Я не знаю, что именно вы хотите, но для построчного получения текстового файла его код, в котором вы можете разобрать строки для специального текста.

<?php
$file = fopen("welcome.txt", "r") or exit("Unable to open file!");
//Output a line of the file until the end is reached
$counter=0;
 while(!feof($file))
  {
  echo fgets($file). "<br>";
  $counter++;
 }
fclose($file);
?>
0 голосов
/ 19 сентября 2018

Вам не нужно делать каких-либо специальных разбиений или регулярных выражений.Просто используйте DateTime :: createFromFormat и укажите свой формат.

Если ваш файл форматируется как Tue,<space>Sep<space>18<tab>2018<tab>23:59:53<tab>[...], вы можете использовать следующий формат ???,?M?d?Y?H:i:s+, который расширяется до

  1. ??? - игнорировать первые 3 символа (wed, mon и т. Д.))
  2. , - Запятая
  3. ? - Некий символ (пробел, табуляция, любой)
  4. M - Месяц в виде текста (сентябрь, сентябрь, Сентябрь и т. Д.)
  5. ? - некоторый символ (пробел, табуляция, любой)
  6. d - день как число
  7. ? - некоторый символ(пробел, табуляция, любая)
  8. Y - год из четырех цифр (2008, 2009 и т. д.)
  9. ? - символ (пробел, табуляция, любая)
  10. Y - часы в виде цифр в течение 24 часов (09, 10, 13 и т. Д.)
  11. : - :
  12. i - минутыцифры (09, 10, 13 и т. д.)
  13. : - An :
  14. s - секунды в виде цифр (09, 10, 13 и т. д.)
  15. + - Игнорировать (но предупреждать!) Любые завершающие символы

Таким образом, ваш код может выглядеть как

//Set Time-Span
$fromDateTime = new DateTime('Wed, Sep 19  2018 00:01:00');
$toDateTime = new DateTime('Wed, Sep 19  2018 00:02:00');

// Load File
$file = file_get_contents('log.txt');

// Split by lines
$lines = explode("\n",$file);

// counter
$rowsintimespan = 0;

// Do Line-By-Line starting by Line 16 (Array Index 15)
for($i = 15; $i < count($lines); $i++) {
    // if the file is "Tue,<space>Sep<space>18<tab>2018<tab>23:59:53<tab>"
    $dateobj = DateTime::createFromFormat("???,?M?d?Y?H:i:s+", $lines[$i]);

    // check if date is in your Timespan
    if($dateobj < $toDateTime && $dateobj > $fromDateTime) {
        $rowsintimespan++; // count if in timespan
    }
}

// Debug-Output
echo $rowsintimespan;

Изменить, чтобы ответить на вашкомментарий, содержащий реальный файл:

Посмотрев hexdump -C вашего test.txt, вы обнаружите, что между днем ​​и годом есть два пробела (последний 20 20 в первой строке).

00000270  0a 0d 0a 54 75 65 2c 20  53 65 70 20 31 38 20 20  |...Tue, Sep 18  |
00000280  32 30 31 38 09 32 33 3a  35 39 3a 35 33 09 33 2e  |2018.23:59:53.3.|
00000290  33 38 30 09 31 2e 36 32  32 09 39 39 35 38 2e 35  |380.1.622.9958.5|
000002a0  30 30 09 37 33 30 31 2e  30 30 30 0d 0a 57 65 64  |00.7301.000..Wed|

Таким образом, ваш формат будет ???,?M?d??Y?H:i:s+.Обратите внимание на второе ? между d??Y.

0 голосов
/ 19 сентября 2018

Я не эксперт по регулярным выражениям, но вы можете попробовать это:

<?php

$content = file_get_contents('b.txt');

$lines = preg_match_all('/(Mon|Tue|Wed|Thu|Fri|Sat|Sun),[ ]{1,}(Jun|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[ ]{1,}[0-9]{2,2}.*/m', $content, $matches);
$fromDateTime = new DateTime('Wed, Sep 19  2018 08:00:00');
$toDateTime = new DateTime('Wed, Sep 19  2018 11:00:00');

foreach($matches[0] as  $line){
    $cols = explode(' ', $line);
    $dateTimeArray = [];
    foreach ($cols as $index => $col) {
        if ($index < 8 && $col) {
            $dateTimeArray[] = $col;
        }
    }
    $dateTime = new DateTime(implode(' ', $dateTimeArray));
    if ($dateTime > $fromDateTime && $dateTime < $toDateTime) {
        print_r($line."\n");
    }   
}
...