Php 如何将此excel格式导入此数据库格式?
我有一个关于将excel单元格数据导入sqlserver数据库的问题。但我的excel数据如下所示:Php 如何将此excel格式导入此数据库格式?,php,sql-server,codeigniter,Php,Sql Server,Codeigniter,我有一个关于将excel单元格数据导入sqlserver数据库的问题。但我的excel数据如下所示: ID|NAME |DAY1 |DAY2 |DAY3 |DAY4 | --+--------+-------+-------+-------+-------+ 1 |John Doe|shift-1|shift-1|shift-1|shift-1| -------------------------------------------- 2 |Alex |shi
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");
$fp=fopen($_文件['csv']['tmp_名称'],'r')或die(“无法打开”);
而($csv_line=fgetcsv($fp,1024))
{
$cnt=计数($csv_行);
对于($i=1;$i),由于您需要按天值对数据进行分组,因此您也需要以这种方式组织循环,从文件中读取的每一行为每天创建一个条目。类似如下:
$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
}
您可以使用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
您可以使用此输出在表中插入。如果您在数据库架构上有相同的表结构,我下面的答案很合适。工作起来很有魅力。顺便说一句,如何忽略标题?@Roman很好。如果您知道始终会有标题行,您可以添加fgetcsv($fp,1024);
在while循环之前读取并丢弃它,或者可能保存结果并使用它们更改数组中的DATETIME
值)