使用goodby CSV跳过第一行

时间:2015-07-15 15:57:23

标签: php csv

我正在尝试使用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);

1 个答案:

答案 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);
});