将具有奇数行的CSV导入MySQL

时间:2013-10-28 23:02:34

标签: php mysql fgetcsv

我遇到了一个有问题的CSV文件,我必须将其导入MySQL 要么通过使用PHP然后插入命令,要么直接通过MySQL的加载数据infile。

我附上了文件中数据的部分截图:
enter image description here

我需要插入的值低于“ACC1000”,所以我必须从第5行开始,然后浏览大约5500行的文件。

不可能跳到下一行,因为对于某些帐户,有多笔付款,如下所示。

enter image description here

我一直试图通过扫描行来发现“ACC”

来到达下一行
if (strpos($data[$c], 'ACC') !== FALSE){
    echo "Yep ";
} else {
    echo "Nope ";
}

我知道这很粗糙,但我真的不知道从哪里开始。

3 个答案:

答案 0 :(得分:1)

如果您的目标表中定义了(外键)约束,那么type列中包含空值的记录将被拒​​绝,您可以使用MySQL的LOAD DATA INFILE来读取第一列到用户变量(转发到后续记录中)并应用其IGNORE关键字跳过那些未通过FK约束的“记录”:

LOAD DATA INFILE '/path/to/file.csv'
    IGNORE
    INTO TABLE my_table
    CHARACTER SET utf8
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES  TERMINATED BY '\r\n'
    IGNORE 4 LINES
    (@a, type, date, terms, due_date, class, aging, balance)
    SET account_no = @account_no := IF(@a='', @account_no, @a)

答案 1 :(得分:0)

您可以采取多种方法。

1)您可以使用@Jorge Campos建议并逐行读取文件,使用PHP代码跳过您不需要的行并将您想要的行插入MySQL。如果你有一个非常大的文件,这种方法的一个潜在缺点是,你要么必须运行一堆小查询,要么建立一个较大的查询,这可能需要一些时间来运行。

2)您可以处理该文件并删除您不需要的任何行/列,将文件保留为可以通过命令行或其他方式直接插入mysql的格式。

根据您决定采用的方法,我或社区可以根据您的需要提供代码示例。

答案 2 :(得分:0)

这个片段应该让你朝着正确的方向前进:

$file = '/path/to/something.csv';

if( ! fopen($file, 'r') ) { die('bad file'); }

if( ! $headers = fgetcsv($fh) ) { die('bad data'); }

while($line = fgetcsv($fh)) {
  echo var_export($line, true) . "\n";
  if( preg_match('/^ACC/', $line[0] ) { echo "record begin\n"; }
}

fclose($fh);

http://php.net/manual/en/function.fgetcsv.php