首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将php中的字符串从CSV文件中拆分并插入到数据库中的多行?

如何将php中的字符串从CSV文件中拆分并插入到数据库中的多行?
EN

Stack Overflow用户
提问于 2015-12-21 06:12:02
回答 2查看 1.2K关注 0票数 2

.csv文件中的数据如下所示:

代码语言:javascript
运行
复制
id | protocol |
1  | SNMP GET |

如何在.csv文件中拆分行协议(SNMP )中的数据,以便将它们存储在数据库中的不同行中?应该是这样的:-

代码语言:javascript
运行
复制
id | protocol_type | protocol |
1  |     SNMP      |   GET    |
EN

回答 2

Stack Overflow用户

发布于 2015-12-21 06:36:02

我试图想出一种简单的方法来简单地执行一个LOAD DATA,并提取出您想要的两个协议列,但无法做到。其次,最好的方法是执行一个负载数据,然后使用MySQL的字符串函数从原始数据中创建您想要的列。

代码语言:javascript
运行
复制
LOAD DATA INFILE 'file.csv'
INTO TABLE protocol (id, protocol_orig)
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\r\n'

接下来,创建所需的两列:

代码语言:javascript
运行
复制
ALTER TABLE protocol ADD protocol_type VARCHAR(55);
ALTER TABLE protocol ADD protocol VARCHAR(10);

现在填充两个新的协议列:

代码语言:javascript
运行
复制
UPDATE protocol
    SET protocol_type = SUBSTRING_INDEX(SUBSTRING_INDEX(protocol_orig, ' ', 1), ' ', -1),
        protocol = SUBSTRING_INDEX(SUBSTRING_INDEX(protocol_orig, ' ', 2), ' ', -1);

最后,如果不再需要原始列protocol_orig,可以删除它:

代码语言:javascript
运行
复制
ALTER TABLE protocol DROP COLUMN protocol_orig;

下面是UPDATE语句中使用的逻辑的演示。对于可能只有一种协议类型而缺少一种协议的情况,它是健壮的:

SQLFiddle

票数 1
EN

Stack Overflow用户

发布于 2015-12-21 06:47:36

我们把事情分成几个阶段

1.从CSV获取数据

代码语言:javascript
运行
复制
function readCSV($csvFile){
    $file_handle = fopen($csvFile, 'r');
    while (!feof($file_handle) ) {
        $line_of_text[] = fgetcsv($file_handle, 1024);
    }
    fclose($file_handle);
    return $line_of_text;
}


// Set path to CSV file
$csvFile = 'sample.csv';
$csv = readCSV($csvFile);

这将检索CSV文件中的数据。哪个$csv返回

代码语言:javascript
运行
复制
array(5) {
  [0] =>
  array(2) {
    [0] => string(2) "id"
    [1] => string(8) "protocol"
  }
  [1] =>
  array(2) {
    [0] => string(1) "1"
    [1] => string(8) "SNMP GET"
  }
  [2] =>
  array(2) {
    [0] => string(1) "2"
    [1] => string(9) "TEST POST"
  }
  [3] =>
  array(2) {
    [0] => string(1) "3"
    [1] => string(7) "ETC LOL"
  }
  [4] => bool(false)
}

$csv 2.将迭代成合适的可读数组.

代码语言:javascript
运行
复制
$res = array();
foreach ($csv as $idx => $data)
{
    // This will skip the header and validate if data is present.
    if ($idx != 0 && $data)
    {
        $rowId = $data[0];
        $protocolType = explode(" ", $data[1])[0]; //Returns 'SNMP'
        $protocol = explode(" ", $data[1])[1]; // Returns 'GET'
        $res[] = array(
            "id" => $rowId, 
            "protocol_type" => $protocolType, 
            "protocol" => $protocol
        );
    }
}

在这个阶段,$res返回,

代码语言:javascript
运行
复制
array(3) {
  [0] =>
  array(3) {
    'id' => string(1) "1"
    'protocol_type' => string(4) "SNMP"
    'protocol' => string(3) "GET"
  }
  [1] =>
  array(3) {
    'id' => string(1) "2"
    'protocol_type' => string(4) "TEST"
    'protocol' => string(4) "POST"
  }
  [2] =>
  array(3) {
    'id' => string(1) "3"
    'protocol_type' => string(3) "ETC"
    'protocol' => string(3) "LOL"
  }
}

3.将它们存储到表

假设您已经拥有带有id, protocol_type, protocol列的表id, protocol_type, protocol

您只需迭代$res的数组并将它们存储到数据库中。(例如)

代码语言:javascript
运行
复制
foreach ($res as $row)
{
    $sqlCommand = "
        INSERT INTO protocol (id, protocol_type, protocol) 
        VALUES ({$row['id']}, {$row['protocol_type']}, {$row['protocol']})";
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34389883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档