CSV import codeigniter с другим массивом

В настоящее время я выполняю проект, который требует от меня импорта данных из файла CSV в базу данных, вот образец данных файла:

|   id_attendance   |   name   |   date   |  time   |
-----------------------------------------------------
|        001        |   lily   |01.01.2018|  07:00  |
|        002        |  thomas  |01.01.2018|  07:02  |
|        003        |   lily   |01.01.2018|  19:00  |
|        004        |  thomas  |01.01.2018|  19:02  |
-----------------------------------------------------

Между тем мне нужно, чтобы эти данные были импортированы в такую ​​таблицу

|   id_attendance   |   name   |   date   |  time_in  |  time_out  |
--------------------------------------------------------------------
|        001        |   lily   |01.01.2018|  07:00    |   19.00    |
|        002        |  thomas  |01.01.2018|  07:02    |   19.02    |
--------------------------------------------------------------------

Это требует от меня автоматического разделения полей времени на time_in и time_out. Пока я уже импортировал csv, вот мой код

Модель importcsv_m.php

function importCSV()
{
    $count=0;
    $fp = fopen($_FILES['userfile']['tmp_name'],'r') or die("can't open file");
    while($csv_line = fgetcsv($fp,1024))
    {
        $count++;
        if ($count == 1)
        {
            continue;
        }
        for($i = 0, $j = count($csv_line); $i < $j; $i++)
        {
            $insert_csv = array();
            $insert_csv['id_attendance'] = $csv_line[0];
            $insert_csv['name'] = $csv_line[1];
            $insert_csv['date'] = $csv_line[2];
            $insert_csv['time'] = $csv_line[3];
        }
        $i++;
        $data = array(
            'id_attendance' => $insert_csv['id_attendance'] ,
            'name' => $insert_csv['name'],
            'date' => $insert_csv['date'],
            'time' => $insert_csv['time'],
           );
        $data['crane_features']=$this->db->insert('attendance', $data);

    }       
    fclose($fp) or die("can't close file");
    $data['success'] = "success";
}

Но это только импорт данных без разделения времени (без time_in и time_out)

Мне было интересно, могу ли я импортировать массив и разделить его на два?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я создал код, который пытается сопоставить начало и конец каждой смены. Это работает путем поиска соответствующей начальной записи, а затем добавления данных для конечного времени. Если соответствующая начальная запись не найдена, она сохраняет эти данные (при условии, что это начальная запись). Как только конечная запись найдена, начальная запись удаляется из $attendancies, поскольку следующая запись может быть новой сменой ...

function importCSV()
{
    $fp = fopen($_FILES['userfile']['tmp_name'],'r') or die("can't open file");
    // Ignore header line
    $header = fgetcsv($fp);
    // Array to store the partial records
    $attendancies = [];
    while($csv_line = fgetcsv($fp))
    {
        // Key to identify first part of record (Name and date)
        $key = $csv_line[1]."/".$csv_line[2];
        if ( isset($attendancies[$key]) ){
            $start = $attendancies[$key];
            // Extract data from first part of record and add in end date from current row
            $data = array(
                'id_attendance' => $start[0] ,
                'name' => $start[1],
                'date' => $start[2],
                'time_in' => $start[3],
                'time_out' => $csv_line[3],
            );
            $data['crane_features']=$this->db->insert('attendance', $data);
            // Remove partial record
            unset($attendancies[$key]);
        }
        else    {
            // Store partial record
            $attendancies[$key] = $csv_line;
        }
    }
    fclose($fp) or die("can't close file");
    $data['success'] = "success";
}

Эй, у меня тут небольшая проблема. Я попытался импортировать другой файл, который содержит другие данные, но в нем написано «повторяющаяся запись« 0 »для ключа« первичный »». Интересно, почему он продолжает вставлять 0 значений в таблицу каждый раз, когда я пытаюсь импортировать новый файл CSV.

Team 02.08.2018 21:26

Возможно, будет проще задать другой вопрос о конкретных данных, с которыми у вас возникли проблемы, и о коде, который вы используете.

Nigel Ren 02.08.2018 21:28

На самом деле я использовал ваш код, и он говорит, что дублируется при моем втором импорте, поэтому я спросил вас в разделе комментариев

Team 02.08.2018 21:30

Поскольку этот код просто резюмирует csv, это зависит от того, что это за ключ и что находится в файле данных. Итак, какие данные в csv вызывают проблему (конкретный пример может помочь)?

Nigel Ren 03.08.2018 07:41

Другие вопросы по теме