1

S0 记录器每月附带一个 csv 文件。该文件每 5 分钟更新一次,可以随时检索。在月底,该文件计数超过 8500 行。当新的一个月开始时,会制作一个新文件。

文件格式是这样的:

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 是最合适的方法。但是如何防止对数据进行重新处理,这种处理相当耗时且不必要呢?

4

4 回答 4

1

假设每月文件总是附加到。

您可以保留一个名为 eg 的小文件2012-january.csv.ptr。该文件保留文件中的最后一个位置;如果它不存在,则从头开始。

每次成功读取时,您都使用ftell(). 当您到达末尾时,您将写入.ptr文件中的最后一个位置。

.ptr文件存在时,您使用 回溯到文件中fseek(),然后按正常方式开始处理。

于 2012-06-12T14:03:56.907 回答
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);
?>
于 2012-06-17T07:03:51.947 回答
0

Here is the code:

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);
}

It reads CSV file line by line, extracts date part from the first column and creates new file and appends data to it.

P.S. folder "monthly" must be writable

于 2012-06-12T14:05:27.890 回答
0

你可以使用任何数据库吗?简单的表将用于数据存储和以后的处理。

于 2012-06-12T13:55:04.497 回答