【问题标题】:How to import parse csv file to Maria DB?如何将解析的 csv 文件导入 Mariadb?
【发布时间】:2021-02-08 07:47:07
【问题描述】:

我有一个解析 csv 文件的 php 代码,我想将解析数据导入 maria db。我该怎么做?

我的代码:

<?php 

$row = 1;
if (($handle = fopen("users.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        echo "<p> $num fields in line $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}

?>

输出:

Task1 % php user_upload.php
<p> 3 fields in line 1: <br /></p>
name<br />
surname<br />
email   <br />
<p> 3 fields in line 2: <br /></p>
John<br />
smith<br />
jsmith@gmail.com<br />
<p> 3 fields in line 3: <br /></p>
HaMish<br />
JONES<br />
ham@seek.com<br />
<p> 3 fields in line 4: <br /></p>
Phil <br />
CARRY   <br />
phil@open.edu.au  <br />
<p> 3 fields in line 5: <br /></p>
Johnny<br />
O'Hare<br />
john@yahoo.com.au<br />
<p> 3 fields in line 6: <br /></p>
Mike<br />
O'Connor<br />
mo'connor@cat.net.nz<br />
<p> 3 fields in line 7: <br /></p>
WILLIAM<br />
SMYthe<br />
happy@ent.com.au<br />
<p> 3 fields in line 8: <br /></p>
HAMISH<br />
jones   <br />
ham@seek.com<br />
<p> 3 fields in line 9: <br /></p>
Sam!!  <br />
WalTERS<br />
sam!@walters.org    <br />
<p> 3 fields in line 10: <br /></p>
Daley<br />
thompson<br />
daley@yahoo.co.nz<br />
<p> 3 fields in line 11: <br /></p>
kevin<br />
Ruley<br />
kevin.ruley@gmail.com<br />
<p> 3 fields in line 12: <br /></p>
Edward <br />
JIKES<br />
edward@jikes@com.au<br />
<p> 1 fields in line 13: <br /></p>
<br />
<p> 1 fields in line 14: <br /></p>
<br />
<p> 1 fields in line 15: <br /></p>
<br />
<p> 1 fields in line 16: <br /></p>
<br />
<p> 1 fields in line 17: <br /></p>
<br />
<p> 1 fields in line 18: <br /></p>
<br />
<p> 1 fields in line 19: <br /></p>
<br />
<p> 1 fields in line 20: <br /></p>
<br />
<p> 1 fields in line 21: <br /></p>
<br />
<p> 1 fields in line 22: <br /></p>
<br />

此外,由于某种原因,即使我的 csv 文件中只有 12 行,它也会继续打印额外的行。但是如何将解析数据存储到 Maria DB?另外,我希望它在将数据插入 MYSQL 之前将姓名和姓氏大写并小写电子邮件。我是新手,所以我不确定,感谢任何帮助。

【问题讨论】:

    标签: php sql database csv mariadb


    【解决方案1】:

    您的空行可能是文件中尾随空格的结果。您可以改用filearray_map,而file 使用适当的标志来跳过空行:

    $lines = file('users.csv', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES)
    $csv = array_map('str_getcsv', $lines);
    

    然后,获取列名(从数组的第一行截取):

    $col_names = array_shift($csv);
    

    然后,整理您的数据并构建一个关联数组:

    $users = [];
    
    foreach($csv as $row) {
        $users[] = [
            $col_names[0] => ucwords(strtolower($row[0])), // name: 
            $col_names[1] => ucwords(strtolower($row[1])), // surname: 
            $col_names[2] => strtolower($row[2]), // email: 
        ];
    }
    

    这里我们使用strtolowerucwords等基本功能对姓名和电子邮件进行规范化,请参阅手册了解更多详细信息。这将产生一个如下所示的数组:

    $users = [
        ['name' => 'John', 'surname' => 'Smith', 'email' => 'jsmith@gmail.com'],
        ['name' => 'Hamish', 'surname' => 'Jones', 'email' => 'ham@seek.com'],
        // ....
    ];
    

    更新:有关上述内容的实时示例,请参阅https://3v4l.org/SFYjd

    然后,您显然需要一个与这些匹配的 MySQL 数据库表。为简单起见,将 id INT 字段作为唯一的自增索引,其余的作为常规 VARCHAR 列。

    创建表后,剩下的就是INSERT数据。对于这方面的非常基本的参考,see here。如果您的数据不受信任,则无论使用MySQLi 还是PDO,您都需要使用prepared statements(另请参阅PHP manual)。考虑 PDO (manual)。

    然而,一般的 MySQL 数据库表设计和数据插入超出了这个答案;它们是家庭作业,因此请仔细阅读并进行实验,如果/当您遇到与数据库插入有关的特定问题时,请发布一个新问题。

    附:如果您的数据已经准备好,您还可以使用LOAD DATA INFILE 将 CSV 直接导入 MySQL。例如,请参见 SO:How do I import CSV file into a MySQL table?,也可参见 Import CSV File Into MySQL Table(以及在过程中转换数据的示例)、MySQL Manual。 (如果您想使用 MySQL 函数而不是 PHP 来处理数据清理,请参阅“输入预处理”部分;只需将 CSV 原样从 PHP 扔到 MySQL。)

    【讨论】:

    • 不能用for循环而不是foreach吗?因为您必须一遍又一遍地编写相同的代码,例如 array[1] 然后 array[2] 等等。
    • [0] [1] [2] 索引将用于每一行的字段。就foreachfor 而言,这方面没有区别。你确定你已经理解了上面的循环是如何工作的吗?根本没有对主数组行的数字索引的引用。 (尽管如果您想使用 for 循环,您需要它。)
    • 啊,我明白了。另外,如何在将值插入 mysql 之前检查电子邮件的格式是否正确,否则会显示错误消息?
    • 我在上面添加了一个活生生的例子,见:3v4l.org/S3nrd ... 至于验证电子邮件,你可以例如使用 PHP 的 FILTER_VALIDATE_EMAILfilter_var()。如果您遇到无法使用的边缘情况,请使用带有适当匹配模式的preg_match。你想如何处理错误取决于你;例如您可以停止处理并输出产生错误的行,然后在 CSV 中手动修复它;或者只是无效的无效电子邮件。
    • 我已将名称“fixer”从 ucfirst 更改为 ucwords。这将按预期呈现像“van damme”这样的名称。但是,O'connor 仍然失败。如果您想正确地修复名称,您将需要一个经过良好调整的正则表达式或一个库。标准化名称,特别是在我们处理国际用户群时,并不像人们希望的那样简单。
    【解决方案2】:

    我会先将 csv 解析为关联数组,然后生成批量插入查询并将其发送到数据库。

    考虑是否需要验证每个值,以便数据库不会抛出错误或以某种方式处理可能的错误。

    如果您不确定如何在 MariaDB 上运行查询(对于这样的任务,这与 MySQL 相同)我建议您在 github 上搜索:“MySQL PHP class

    检查 this link 以获取解析 csv 的函数。 基本上,它在while() 循环中使用fgetcsv() 函数。

    然后,一旦您拥有包含数据的数组,您就可以执行foreach() 循环来生成插入查询。例如:

    INSERT into users (field_1,field_2,field_3,field_4,field_5) values 
    (value_1,value_2,value_3,value_4,value_5),
    (value_1,value_2,value_3,value_4,value_5);
    

    您可能还会发现this post 很有用。

    最后但同样重要的是,搜索互联网。它充满了完成这项任务的示例:)

    【讨论】:

      【解决方案3】:
      insert into table (column1, columne2) values
      (
        json_value(concat('{"data": [', csvstringarow, ']}'), '$.data[0]'),
        json_value(concat('{"data": [', csvstringarow, ']}'), '$.data[1]')
      )
      

      【讨论】:

      • 纯代码答案并不是特别有用。请添加一些关于此代码如何解决问题的说明。
      猜你喜欢
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      相关资源
      最近更新 更多