根据现有和不存在的数据创建一个csv文件

时间:2018-10-17 07:51:40

标签: php mysql laravel csv export-to-csv

我很高兴认识你们。你太棒了!

因此,我在laravel上使用查询生成器遇到了问题。实际上,我想使用不存在的数据创建一个csv文件。我发出带有时间戳的请求,并且之前没有某些数据。要创建我的csv,我首先需要使用以下函数获取标头:

public static function getHeaders($sTables) {


    $data = DB::connection('mysql2')
            ->table('data_sub_category')
            ->select('data_sub_category.designation as sub', 'data_key.designation as dkey')
            ->join('data_key', 'data_key.id_data_sub_category', '=', 'data_sub_category.id')
            ->whereIn('data_sub_category.id', $sTables)
            ->orderBy('data_sub_category.id', 'ASC')
            ->distinct()
            ->get();

    return $data;
}

要获取数据,我使用以下方法:

 public static function prepare_data_export($iIdCodeTransmetteur, $sTables, $dtStart, $dtEnd) {

    $data = DB::connection('mysql2')
            ->table('data_row')
            ->select('data_sub_category.designation as sub_d','data_sub_category.id as sub_id', 'data_key.designation as key_d','data_key.id as key_id','data_row.id_data as id_data', 'data_row.value', DB::raw("(DATE_FORMAT(FROM_UNIXTIME(timestamp), '%d/%m/%Y %h:%i:%s')) as timestamp"))
            ->join('data', 'data.id', '=', 'data_row.id_data')
            ->join('data_key', 'data_key.id', '=', 'data_row.id_data_key')
            ->join('data_sub_category', 'data_sub_category.id', '=', 'data_row.id_data_sub_category')
            ->join('data_category', 'data_category.id', '=', 'data_row.id_data_category')
            ->where('code_unique', $iIdCodeTransmetteur)
            ->whereIn('data_sub_category.id', $sTables)
            ->whereBetween('data.timestamp', array($dtStart, $dtEnd))
            ->orderBy('data.timestamp', 'ASC')
            ->orderBy('data_sub_category.id', 'ASC')
            ->orderBy('data_key.id','ASC')
            ->get();

    return $data;
}

这2个函数位于名为:

的变量中
    $getHeaders = Data::getHeaders($sTables);
    $results = Data::prepare_data_export($iIdCodeTransmetteur, $sTables, $dtStart, $dtEnd)->groupBy('id_data')->toArray();

然后,我逐行创建csv文件,将值一个接一个地放置,并以','分隔。最后,csv文件如下所示:

public function ajaxCreateCsv(Request $request) {
   ini_set('memory_limit', '-1');
   ini_set('max_execution_time', 900000); //15 minutes


   $bError = false;
   $messages_errors = array();
   $isSuccess = false;

   $aTables = $request->tables;
   $dtStart = $request->dtStart;
   $dtEnd = $request->dtEnd;
   $iIdCodeTransmetteur = $request->code_transmetteur;

   $sTables = [];

   /*
     for ($i=0; $i < count($dataRow); $i++) {
     $sRow .= $dataRow[$i]['value'] . ',';
     }
     $sRow = substr($sRow, 0, -1);
    */

   if ($aTables) {
       for ($i = 0; $i < count($aTables); $i++) {
           array_push($sTables, intval($aTables[$i]['value']));
       }
   } else {
       $aTables = Data::getAllGroupDataByIidForAjax($iIdCodeTransmetteur);

       for ($i = 0; $i < count($aTables); $i++) {
           array_push($sTables, intval($aTables[$i]->id));
       }
   }


   $getHeaders = Data::getHeaders($sTables);
   $result = Data::prepare_data_export($iIdCodeTransmetteur, $sTables, $dtStart, $dtEnd);
   $line = 'Date de réception, ';
   $last_timestamp = '01/01/2018 00:00:00';


   if (count($result) < 1) {
       $response_array['status'] = 'error';
       $error_message = $error_message . "Aucune données disponible pour ces dates";
       array_push($messages_errors, ["date", $error_message]);
   } else {

       foreach ($getHeaders as $key) {
           $array = $key->sub . '.' . $key->dkey;
           $line .= $array . ", ";
       }
       $line = substr($line, 0, -1);

       foreach ($result as $key) {
           $datetime = $key->timestamp;
           $value = $key->value;

           if ($datetime == $last_timestamp) {
               if ($value == NULL) {
                   $value = "NULL";
               }
               $line .= $value . ", ";
               $last_timestamp = $datetime;
           } else {
               $line = substr($line, 0, -1);
               $line .= "\n";
               $line .= $datetime . ", ";
               if ($value == NULL) {
                   $value = "NULL";
               }
               $line .= $value . ", ";
               $last_timestamp = $datetime;
           }
       }
       $line = substr($line, 0, -1);

       $isSuccess = true;
   }

   if ($isSuccess == false) {
       $response_array['status'] = 'error';
       $response_array['messages'] = $messages_errors;
   } else {
       file_put_contents("file.csv", $line);
       $response_array['status'] = 'success';
   }

   return response()->json($response_array);

带有数据的输出csv文件 The output csv file with data

现在,该文件看起来非常不错,而且对于大多数文件来说,您是对的。尽管在行尾,有些列是空的。这是因为在数据库中,对于精确的时间戳记,一些数据不存在

问题: the problem

data_key从请求getHeader接收表观风速,true_wind_speed和water_speed,但目前我们没有任何值。 因此,我的csv无法创建具有正确值的列。

两个不同时间戳记的值ID,缺少92到94

id of values for two different timestamps, missing 92 to 94

在csv文件或数据库中,我找不到一种填充值的方法来获取不存在该值的“空”值。我尝试在请求中使用LEFT JOIN来强制MySQL遍历所有id,甚至缺少的id,但似乎无法正常工作。

希望您能找到一种帮助的方式,我会继续努力并更新请求。

0 个答案:

没有答案