【问题标题】:How to import this excel format into this database format?如何将此excel格式导入此数据库格式?
【发布时间】:2019-02-19 04:23:34
【问题描述】:

我有一个关于将 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 格式,因为这会影响到所有分支机构。

【问题讨论】:

  • 如果您在数据库架构上具有相同的表结构,则我的以下答案适合。

标签: php sql-server codeigniter


【解决方案1】:

由于您需要按日期值对数据进行分组,因此您也需要以这种方式组织循环,从文件中读取的每一行中为每一天创建一个条目。像这样的:

$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
}

【讨论】:

  • 工作就像一个魅力。顺便说一句,如何忽略标题?
  • @Roman 很高兴听到。如果您知道总会有一个标题行,您可以在 while 循环之前添加 fgetcsv($fp, 1024); 以读取它并将其丢弃,或者可能保存结果并使用它们来更改数组中的 DATETIME 值)
【解决方案2】:

您可以使用 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 

您可以使用此输出在您的表格中插入。

【讨论】:

    猜你喜欢
    • 2019-08-14
    • 1970-01-01
    • 2011-08-27
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多