我遇到了一个有问题的CSV文件,我必须将其导入MySQL 要么通过使用PHP然后插入命令,要么直接通过MySQL的加载数据infile。
我附上了文件中数据的部分截图:
我需要插入的值低于“ACC1000”,所以我必须从第5行开始,然后浏览大约5500行的文件。
不可能跳到下一行,因为对于某些帐户,有多笔付款,如下所示。
我一直试图通过扫描行来发现“ACC”
来到达下一行if (strpos($data[$c], 'ACC') !== FALSE){
echo "Yep ";
} else {
echo "Nope ";
}
我知道这很粗糙,但我真的不知道从哪里开始。
答案 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);