2

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

我附上了文件中数据外观的部分屏幕截图:
在此处输入图像描述

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

无法跳到下一行,因为对于某些帐户,有多个付款,如下所示。

在此处输入图像描述

我一直试图通过扫描行以查找“ACC”的出现来到达下一行

if (strpos($data[$c], 'ACC') !== FALSE){
    echo "Yep ";
} else {
    echo "Nope ";
}

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

4

3 回答 3

1

如果您在目标表中定义了(外键)约束,使得type列中具有空白值的记录将被拒​​绝,您可以使用 MySQLLOAD 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)
于 2013-10-28T23:21:57.937 回答
0

您可以采取几种方法。

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

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

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

于 2013-10-28T23:13:29.770 回答
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

于 2013-10-28T23:14:26.710 回答