В настоящее время я выполняю проект, который требует от меня импорта данных из файла 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)
Мне было интересно, могу ли я импортировать массив и разделить его на два?






Я создал код, который пытается сопоставить начало и конец каждой смены. Это работает путем поиска соответствующей начальной записи, а затем добавления данных для конечного времени. Если соответствующая начальная запись не найдена, она сохраняет эти данные (при условии, что это начальная запись). Как только конечная запись найдена, начальная запись удаляется из $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";
}
Возможно, будет проще задать другой вопрос о конкретных данных, с которыми у вас возникли проблемы, и о коде, который вы используете.
На самом деле я использовал ваш код, и он говорит, что дублируется при моем втором импорте, поэтому я спросил вас в разделе комментариев
Поскольку этот код просто резюмирует csv, это зависит от того, что это за ключ и что находится в файле данных. Итак, какие данные в csv вызывают проблему (конкретный пример может помочь)?
Эй, у меня тут небольшая проблема. Я попытался импортировать другой файл, который содержит другие данные, но в нем написано «повторяющаяся запись« 0 »для ключа« первичный »». Интересно, почему он продолжает вставлять 0 значений в таблицу каждый раз, когда я пытаюсь импортировать новый файл CSV.