1

您如何使用 php 将 csv 文件解析为 mysql 数据库,从我从 php 文档中读取的位中,我不确定如何或是否可以将条件添加到您正在读入数据库的行中,以便只有满足的值条件被传递到数据库中。

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

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

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

4

2 回答 2

0

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

接下来,在检查以确保 isnot或的返回值之后,代码使用 . 检查数组的第一个字段fgetcsv是否包含 [GZ] 范围内的任何非十六进制字符。如果没有,那么它会将数组的两个字段(代表 csv 文件中的一行)放入一个新数组中,您可以稍后对其进行操作。falsenullpreg_match

<?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它来编写代码,因为它是面向对象的,并且可能比上述函数更易于使用。

于 2011-06-27T03:50:05.177 回答
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),则它们无效。

如果你必须使用 PHP,我个人会简单地继续使用 MySQL 的 INSERT,我仍然会调用上面的 DELETE。我敢打赌它会更快。

于 2011-06-27T04:16:08.710 回答