我正在尝试使用goodby CSV从CSV文件导入中删除列标题名称。我尝试使用方法found online,但在执行脚本时表格为空。示例如下:
$pdo = new PDO('mysql:host='.$db['server'].';dbname='.$db['database'], $db['user'], $db['password'], array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
));
$config = new LexerConfig();
$lexer = new Lexer($config);
$interpreter = new Interpreter();
$lineNumber = 0;
$interpreter->addObserver(function(array $columns) use (&$lineNumber) {
$lineNumber += 1;
if ($lineNumber === 1) {
return;
}
// treat $columns here
$stmt = $pdo->prepare('INSERT INTO providers (id, address, city) VALUES (?, ?, ?)');
$stmt->execute($columns);
});
$lexer->parse('some.csv', $interpreter);
答案 0 :(得分:2)
在最近版本的Goodby CSV中跳过第一行的最简单方法是调用$config->setIgnoreHeaderLine(true);
(在2013年11月发布的1.1.0版中添加)。
但原始代码究竟出了什么问题?
您的观察者是anonymous function(在其他语言中称为"闭包"并且有自己的scope。
这对您来说意味着$pdo
变量在您的观察者中未定义(我们说您的闭包缺少对$pdo
的引用)。在以这种方式创建闭包时,您可以包含对$pdo
的引用:
...
$interpreter->addObserver(function(array $columns) use (&$lineNumber, $pdo) {
...
出于性能原因,如果我们只创建一次$stmt
并为每一行重复使用它,那就更好了。然后,您根本不需要$pdo
功能,但需要引用$stmt
:
$stmt = $pdo->prepare('INSERT INTO providers (id, address, city) VALUES (?, ?, ?)');
$interpreter->addObserver(function(array $columns) use (&$lineNumber, $stmt) {
$lineNumber += 1;
if ($lineNumber === 1) {
return;
}
// treat $columns here
$stmt->execute($columns);
});