如何用PHP条件将csv文件解析成mysql DB

时间:2011-06-27 03:05:11

标签: php mysql csv fgetcsv

如何使用php将csv文件解析为mysql数据库,从php文档中读取的内容我不知道如何或者是否可以为您正在读入数据库的行添加条件以便仅满足条件的值将传递到数据库中。

例如,我目前有一个看起来像这样的csv文件

0001D,5879
0001E,0521
0001F,4587
0001G,2220
0001H,2482
0001I,9087
0001J,2255
0001K,2247

逗号之前的代码应该只是十六进制值,我想要做的是排除不代表十六进制代码的任何行(十六进制值及其代码)(0-9) - (AF) ......关于如何实现的任何想法?

2 个答案:

答案 0 :(得分:0)

此代码使用fgetcsv函数一次从csv文件中解析出一行,将每个分隔的字段放入一个数组中,然后返回该数组。使用示例csv,返回的数组将只包含两个字段。

接下来,在检查以确保fgetcsv的返回值不是falsenull之后,代码会检查数组的第一个字段是否包含任何非-hex使用preg_match在[GZ]范围内的字符。如果没有,那么它会将数组的两个字段(表示来自csv文件的一行)放入一个新的数组中,以后可以操作。

<?php
$fileName = "test.csv";
$hexLines = array();

if (($file = fopen($fileName, "r")) !== false)
{
    while (($line = fgetcsv($file, 0, ",")) !== false)
    {
        if (!empty($line))
        {
            // IF first field only has hex chars
            if (preg_match('/^[0-9A-F]+$/', $line[0]) === 1) 
            {
                $hexLines[] = array($line[0], $line[1]);
            }
        }
    }
    fclose($file);
}
print_r($hexLines);

顺便说一句,上面的代码可以在PHP版本5.2.x和5.3.x中使用。如果你100%确定你将使用5.3,我会用SplFileObject编写代码,因为它是面向对象的,并且可能比上面的函数更容易使用。

答案 1 :(得分:0)

如果可能的话,如果没有PHP,你可以做得更好。使用mysqlimport导入文件,然后使用:

-- assuming you use "ID" as your first column like the example 
-- on the mysqlimport page
DELETE FROM <tablename> WHERE CONV(CONV(ID, 16, 10), 10, 16) != 
                              TRIM(LEADING '0' FROM ID);

那么,发生了什么?

  1. 首先,您已将所有内容导入表格中。
  2. 然后,您查看了所有应该是十六进制的列。如果它们不能转换为十六进制并返回(某些只有有效的十六进制数字,其他一切都被截断)并匹配自己的修剪版本(需要考虑前导0),它们无效。
  3. 如果你必须使用PHP,我个人只是不断使用MySQL的INSERT,我仍然会调用上面的DELETE。我敢打赌钱会更快。