PHP根据日期和时间对文本文件行进行计数 [英] PHP count text file rows based on date and time
问题描述
我在文本文件(.txt)上有日志数据
I have log data on text file (.txt)
文本文件中的数据如下:
The data on text file like this:
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));
它将获取所有行.
现在我要问的是,我想计算日期和时间条件下文本文件的行数.获取计数 2018年9月19日星期三08:00:00
直到 2018年9月19日星期三11:00:00
So my question now, I want to count the rows of text file with condition from date and time. Get the count Wed, Sep 19 2018 08:00:00
until Wed, Sep 19 2018 11:00:00
所以结果应该是: 4
有可能吗?
更新
日志文件正在使用标签页,那么代码将错误读取:
UPDATE
The log file is using tab, then the code can' read with error:
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
推荐答案
您不必进行任何特殊的拆分或正则表达式.只需使用DateTime :: createFromFormat并指定您的格式即可.
You don't have to do any special splitting or regexing. Just use DateTime::createFromFormat and specify your format.
如果文件的格式类似于 Tue,< space> Sep< space> 18< tab> 2018< tab> 23:59:53< tab> [...]
以下格式 ???,?M?d?Y?H:i:s +
扩展为
If your file is formated like Tue,<space>Sep<space>18<tab>2018<tab>23:59:53<tab>[...]
you can use the following format ???,?M?d?Y?H:i:s+
which expands to
-
???
-忽略前3个字符(星期三,星期一等) -
,
-逗号 -
?
-一些字符(空格,制表符,任意) -
M
-月份为文本(9月,9月,9月等) -
?
-一些字符(空格,制表符,任意) -
d
-以数字表示的日子 -
?
-一些字符(空格,制表符,任意) -
Y
-年份为四位数(2008、2009等) -
?
-一些字符(空格,制表符,任意) -
Y
-小时数,以24小时为单位(09、10、13等) -
:
-一个:
-
i
-分钟以数字(09、10、13等) -
:
-一个:
-
s
-以秒为单位的数字(09、10、13等) -
+
-忽略(但警告!)任何尾随字符
???
- Ignore first 3 characters (wed, mon, etc),
- An comma?
- Some character (space, tab, any)M
- The month as text (Sep, Sept, September, etc)?
- Some character (space, tab, any)d
- The day as number?
- Some character (space, tab, any)Y
- The year as four digits (2008, 2009, etc)?
- Some character (space, tab, any)Y
- The hours as digits in 24h (09, 10, 13, etc):
- An:
i
- The minutes as digits (09, 10, 13, etc):
- An:
s
- The seconds as digits (09, 10, 13, etc)+
- Ignore (but warn!) any trailing characters
所以您的代码看起来像
//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;
编辑以回复评论并提供真实文件:
通过查看test.txt的 hexdump -C
,您会发现日与年之间有两个空格(第一行的最后 20 20
).
By looking at a hexdump -C
of your test.txt you can find, that there are two spaces between day and year (last 20 20
in the first line).
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
之间的第二个?
.
So your format would be ???,?M?d??Y?H:i:s+
. Notice the second ?
between d??Y
.
这篇关于PHP根据日期和时间对文本文件行进行计数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!