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の日次ファイルに分割し、これらのファイルを保存して、さらに使用および処理したいと思います。列名は使用できません。

日中は5分ごとにデータが更新されますが、1日が終わった後は何も変わらないため、このデータを再処理する必要はありません。fgetcsvが最も適切な方法であることがわかりました。しかし、かなり時間がかかり、不必要なデータの再処理を防ぐにはどうすればよいでしょうか。

4

4 に答える 4

1

毎月のファイルが常に追加されると仮定します。

たとえば、という名前の小さなファイルを保持できます2012-january.csv.ptr。このファイルは、ファイル内の最後の位置を保持します。存在しない場合は、最初から始めます。

読み取りが成功するたびに、 を使用してファイル ポインタを決定しますftell()。最後に到達したら、.ptrファイル内の最後の位置を書き込みます。

.ptrファイルが存在する場合は、を使用してファイルに戻ってシークし、fseek()通常どおり処理を開始します。

于 2012-06-12T14:03:56.907 に答える
0

データベースを使用できますか?単純なテーブルは、データの保存とその後の処理に役立ちます。

于 2012-06-12T13:55:04.497 に答える
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 ファイルを 1 行ずつ読み取り、最初の列から日付部分を抽出し、新しいファイルを作成してデータを追加します。

PS フォルダ「月次」は書き込み可能である必要があります

于 2012-06-12T14:05:27.890 に答える
0

答えを組み合わせると、これは機能しますが、スクリプトを再度実行すると、分割ファイルの1行が欠落し、その理由がわかりません。

<?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 に答える