создание CSV-файла из существующих и несуществующих данных - PullRequest
0 голосов
/ 17 октября 2018

Я очень рад познакомиться с вами, ребята.ты потрясающий!

Итак, у меня проблема с компоновщиком запросов на 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 получает visible_wind_speed, true_wind_speed и water_speed из запроса getHeader, но длятеперь у нас нет для них ценности.Таким образом, мой CSV не создает столбцы с правильными значениями.

идентификатор значений для двух разных временных отметок, пропуская 92 до 94

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

Я могу 't найти способ заполнить значения либо в файле csv, либо в базе данных, чтобы получить «нулевое» значение, если значение не существует.Я попытался использовать LEFT JOIN в своем запросе, чтобы заставить MySQL запускать все идентификаторы, даже пропущенные, но, похоже, это не сработало.

Надеюсь, вы найдете способ помочь,Я продолжу работать над этим и обновлю запрос.

...