PHP,处理和拆分CSV文件

时间:2012-06-12 13:45:18

标签: php

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是最合适的方法。但是如何防止数据的再处理相当耗时且不必要?

4 个答案:

答案 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);
?>