S0-logger每月都附带一个csv文件。该文件每5分钟更新一次,可以随时检索。在月末,文件计数超过8500行。当新月开始时,会创建一个新文件。
Fileformat是这样的:
Datum / Uhrzeit (UTC);Main meter - Sales office (kWh);Meter 9;Temperature - Server room;Supply conductor air conditioner
01.06.12 00:00:00;438.220;0.001;274;155
01.06.12 00:05:00;438.240;0.001;274;203
01.06.12 00:10:00;438.259;0.001;275;134
01.06.12 00:15:00;438.283;0.001;274;176
01.06.12 00:20:00;438.303;0.001;274;206
dd.mm.yy
(这是欧洲日期格式)
我想将每月文件拆分为文件名为yymmdd.csv的每日文件,并存储这些文件以供进一步使用和处理。列名没有用。
白天,其数据每五分钟更新一次,但在一天结束后,无需重新处理此数据,因为没有任何变化。我发现fgetcsv是最合适的方法。但是如何防止数据的再处理相当耗时且不必要?
答案 0 :(得分:1)
假设每月文件始终附加到。
你可以保留一个名为eg的小文件2012-january.csv.ptr
。该文件保留文件中的最后位置;如果它不存在,你从头开始。
每次成功读取时,都使用ftell()
确定文件指针。当你到达最后,你在.ptr
文件中写下最后一个位置。
当.ptr
文件存在时,您使用fseek()
搜索回文件,然后按正常方式开始处理。
答案 1 :(得分:0)
你能使用任何数据库吗?简单的表可用于数据存储和后续处理。
答案 2 :(得分:0)
以下是代码:
if ($fp = fopen('log.csv', 'r')) {
$line_number = 0;
while ($line = fgetcsv($fp, 0, ';')) {
if ($line_number++ == 0) {
continue;
}
$date = explode(' ', $line[0]);
$file = $date[0] .'.log';
file_put_contents(
'monthly/'. $file,
implode(';', $line) ."\n",
FILE_APPEND
);
}
fclose($fp);
}
逐行读取CSV文件,从第一列中提取日期部分并创建新文件并将数据附加到其中。
P.S。 文件夹“每月”必须是可写的
答案 3 :(得分:0)
结合答案我想出来了: 它工作正常,但有时再次运行脚本我错过了分割文件中的一行,我无法弄清楚原因。
<?php
$fh = fopen('2012_06.csv.ptr', 'r');
$pos1 = fread( $fh, 8192 );
//echo $pos1 , 'a',"<BR>";
fclose ($fh);
if ($fp = fopen('2012_06.csv', 'r'))
fseek ($fp , $pos1 );
{
$line_number = 0;
while ($line = fgetcsv($fp, 0, ';')) {
if ($line_number++ == 0) {
continue;
}
$date = explode(' ', $line[0]);
$file = $date[0] .'.log';
file_put_contents(
'Monthly/'. $file,
implode(';', $line) ."\n",
FILE_APPEND
);
}
$pos2 = ftell ($fp);
//echo $pos2;
fclose($fp);
}
$fh = fopen('2012_06.csv.ptr', 'w');
fwrite ($fh, $pos2);
fclose ($fh);
?>