Как импортировать этот формат Excel в этот формат базы данных? - PullRequest
0 голосов
/ 19 февраля 2019

У меня вопрос об импорте данных из ячеек Excel в базу данных sqlserver.Но мои данные Excel выглядят так:

ID|NAME    |DAY1   |DAY2   |DAY3   |DAY4   |  
--+--------+-------+-------+-------+-------+  
1 |John Doe|shift-1|shift-1|shift-1|shift-1|
--------------------------------------------
2 |Alex    |shift-2|shift-2|shift-2|shift-2|
--------------------------------------------
3 |McArthur|shift-3|shift-3|shift-3|shift-3|
--------------------------------------------

, а формат моей базы данных выглядит примерно так:

DateTime|ID|NAME    |SCHEDULE|
--------+--+--------+--------+
DAY1    |1 |John Doe|Shift-1 |
------------------------------
DAY1    |2 |Alex    |Shift-2 |
------------------------------
DAY1    |3 |McArthur|Shift-3 |
------------------------------
DAY2    |1 |John Doe|Shift-1 |
------------------------------
DAY2    |2 |Alex    |Shift-2 |
------------------------------
DAY2    |3 |McArthur|Shift-3 |
------------------------------
DAY3    |1 |John Doe|Shift-1 |
------------------------------
DAY3    |2 |Alex    |Shift-2 |
------------------------------
DAY3    |3 |McArthur|Shift-3 |
------------------------------
DAY4    |1 |John Doe|Shift-1 |
------------------------------
DAY4    |2 |Alex    |Shift-2 |
------------------------------
DAY4    |3 |McArthur|Shift-3 |

, и я попытался написать код, и, конечно, он не прав.

$fp = fopen($_FILES['csv']['tmp_name'],'r') or die("Can't Open");
while($csv_line = fgetcsv($fp,1024))
{
$cnt = count($csv_line);
for($i=1;$i<=$cnt;$i++){
    $data[$i]['ID']   = $csv_line[1];
    $data[$i]['NAME'] = $csv_line[2];
    $data[$i]['DAY1'] = $csv_line[3];
    $data[$i]['DAY2'] = $csv_line[4];
    $data[$i]['DAY3'] = $csv_line[5];
    $data[$i]['DAY4'] = $csv_line[6];
}
    return $data;
}
    fclose($fp) or die("Error");

Это возможно сделать?потому что моя компания не хочет менять старый формат Excel, потому что это повлияет на все филиалы.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Вы можете использовать Unpivot , чтобы получить желаемый результат.Но это работает на конце базы данных.Сначала вы поместите эту запись в базу данных, а затем используйте Unpivot для преобразования записи в нужный вам формат.

    GO
    SELECT [datetime], id, name, schedule  
    FROM   
       (SELECT id, name, Day1, day2, day3, day4 
       FROM pvt) p  
    UNPIVOT  
       (schedule FOR [datetime] IN   
          (Day1, day2, day3, day4)  
    )AS unpvt;  
    GO 

Вы можете использовать этот вывод для вставки в таблицу.

0 голосов
/ 19 февраля 2019

Поскольку вам необходимо сгруппировать данные по значениям дня, вам также необходимо организовать цикл таким образом, создавая одну запись для каждого дня из каждой строки, считанной из файла.Примерно так:

$data = array();
while($csv_line = fgetcsv($fp,1024)) {
    $data[] = array('DATETIME' => 'DAY1', 'ID' => $csv_line[0], 'NAME' => $csv_line[1], 'SCHEDULE' => $csv_line[2]);
    $data[] = array('DATETIME' => 'DAY2', 'ID' => $csv_line[0], 'NAME' => $csv_line[1], 'SCHEDULE' => $csv_line[3]);
    $data[] = array('DATETIME' => 'DAY3', 'ID' => $csv_line[0], 'NAME' => $csv_line[1], 'SCHEDULE' => $csv_line[4]);
    $data[] = array('DATETIME' => 'DAY4', 'ID' => $csv_line[0], 'NAME' => $csv_line[1], 'SCHEDULE' => $csv_line[5]);
}

После этого вы сможете вставить каждую строку массива $data в свою базу данных, например,

foreach ($data as $d) {
    // insert $d into database
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...