Php 如何将解析csv文件导入Maria DB?

Php 如何将解析csv文件导入Maria DB?,php,sql,database,csv,mariadb,Php,Sql,Database,Csv,Mariadb,我有一个php代码,我正在解析csv文件,我想将解析数据导入maria db。我该怎么做 我的代码: <?php $row = 1; if (($handle = fopen("users.csv", "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { $num = count($data);

我有一个php代码,我正在解析csv文件,我想将解析数据导入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 />
Task1%php用户\u upload.php
第1行中的3个字段:

名称
姓氏
电子邮件
第2行中的3个字段:

约翰
史密斯
jsmith@gmail.com
第3行中的3个字段:

哈米什
琼斯
ham@seek.com
第4行中的3个字段:

菲尔
携带
phil@open.edu.au
第5行中的3个字段:

约翰尼
奥黑尔
john@yahoo.com.au
第6行中的3个字段:

迈克
奥康纳
莫connor@cat.net.nz
第7行中的3个字段:

威廉
斯迈思
happy@ent.com.au
第8行中的3个字段:

哈米什
琼斯
ham@seek.com
第9行中的3个字段:

山姆
沃尔特斯
山姆@walters.org
第10行中的3个字段:

戴利
汤普森
daley@yahoo.co.nz
第11行中的3个字段:

凯文
规则
凯文。ruley@gmail.com
第12行中的3个字段:

爱德华
吉克斯
edward@jikes@com.au
第13行中的1个字段:


第14行中的1个字段:


第15行中的1个字段:


第16行中的1个字段:


第17行中的1个字段:


第18行中的1个字段:


第19行中的1个字段:


第20行中的1个字段:


第21行中的1个字段:


第22行中的1个字段:



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

您的空行可能是文件中拖尾空格的结果。您可以改为使用
文件
数组映射
,使用
文件
使用适当的标志跳过空行:

$lines = file('users.csv', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES)
$csv = array_map('str_getcsv', $lines);
然后,获取列名(从数组的第一行截取):

然后,整理数据,并在整理数据时构建关联数组:

$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: 
    ];
}
在这里,我们使用基本功能(如和)对姓名和电子邮件进行规范化,有关更多详细信息,请参阅手册。这将产生如下数组:

$users = [
    ['name' => 'John', 'surname' => 'Smith', 'email' => 'jsmith@gmail.com'],
    ['name' => 'Hamish', 'surname' => 'Jones', 'email' => 'ham@seek.com'],
    // ....
];
更新:有关上述内容的实时示例,请参阅

然后,您显然需要一个与之匹配的MySQL数据库表。为了简单起见,可以使用
id INT
字段作为唯一的自动递增索引,其余字段作为常规
VARCHAR

创建表后,剩下的就是插入数据。对于这方面非常基本的参考。如果您的数据不受信任,您将希望改用(另请参阅),无论是使用还是。考虑PDO(),< /P> 然而,一般的MySQL数据库表设计和数据插入超出了这个答案;它们是家庭作业,所以请仔细阅读并进行实验,如果/当您在数据库插入中遇到特定问题时,请发布新问题


另外,如果您的数据已经准备好,您也可以使用
LOAD data infle
将CSV直接导入MySQL。例如,请参见SO:,以及(流程中转换数据的示例)。(请参阅“输入预处理”一节,以防您希望使用MySQL函数而不是PHP来处理数据清理;只需将您的CSV从PHP转换为MySQL即可。)

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

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

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

检查用于解析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);
您可能也会发现它很有用


最后但并非最不重要的一点是,搜索互联网。实现此任务的例子不胜枚举:)

使用for循环而不是foreach是否不可能?因为您必须反复编写相同的代码,例如数组[1],然后是数组[2]等等。每行字段都有
[0][1][2]
索引。在这方面,foreach和go的
。你确定你已经理解了上面的循环是如何工作的吗?根本并没有对主数组行的数字索引的引用。(不过,如果您想使用
进行
循环,就需要这样做。)啊,我明白了。另外,在mysql中插入值或显示错误消息之前,我如何检查电子邮件的格式是否正确?我已经在上面的一个实例中添加了,请参见:。。。至于验证电子邮件,您可以使用PHP的。如果您的边缘案例无法使用,请使用带有适当匹配图案的
preg\u match
。如何处理错误取决于您自己;e、 g.您可以停止处理并输出产生错误的行,然后在CSV中手动修复它;或者只是无效的空电子邮件。我已将名称“fixer”从
ucfirst
更改为
ucwords
。这将像预期的那样呈现“van damme”这样的名称。但是,使用O'connor时,它仍然会失败。如果您想正确地修复名称,您需要一个经过良好调优的正则表达式或一个库。标准化名称,特别是当我们与国际用户群打交道时,并不完全是一个sim卡
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);