2014-06-27 85 views
1

我想通过PHP脚本将表格从CSV文件导入到SQLite DB中,我可以手动运行以更新数据。通过PHP导入CSV文件到SQLite数据库

下面有什么,我想实现一个列表:

  1. 重命名旧表(这被称为“PRODUKTE”)到产品的currentdate(或删除表)
  2. 然后从导入文件CSV文件(;分离和ISO 8859-1字符集/该CSV文件的第一行包含表头)
  3. 保存日期表中的“产品”

我找到了一个纸条t内由于某种原因不能正常工作:

<?php 
$dir = 'sqlite:test.sqlite'; 
$dbh = new PDO($dir) or die("cannot open the database"); 


$query = <<<eof 
    LOAD DATA LOCAL INFILE 'produkte.csv' 
    INTO TABLE produkte 
    FIELDS TERMINATED BY ';' 
    OPTIONALLY ENCLOSED BY '"' 
    LINES TERMINATED BY '\n' 
    IGNORE 1 LINES 
    (id, Hauptmenue, Produktgruppe, Beschreibung, Text, Bild, Shop, Info) 

eof; 

$dbh->query($query); 

?> 

我希望有人知道如何解决我的问题......

最好的问候戴夫

+0

既是功能并不为你工作,我建议你检查你的文件的错误 –

回答

2

Federico Cingolani发布了一个PHP脚本在Github能够满足您需要

<?php 
function import_csv_to_sqlite(&$pdo, $csv_path, $options = array()) 
{ 
    extract($options); 

    if (($csv_handle = fopen($csv_path, "r")) === FALSE) 
     throw new Exception('Cannot open CSV file'); 

    if(!$delimiter) 
     $delimiter = ','; 

    if(!$table) 
     $table = preg_replace("/[^A-Z0-9]/i", '', basename($csv_path)); 

    if(!$fields){ 
     $fields = array_map(function ($field){ 
      return strtolower(preg_replace("/[^A-Z0-9]/i", '', $field)); 
     }, fgetcsv($csv_handle, 0, $delimiter)); 
    } 

    $create_fields_str = join(', ', array_map(function ($field){ 
     return "$field TEXT NULL"; 
    }, $fields)); 

    $pdo->beginTransaction(); 

    $create_table_sql = "CREATE TABLE IF NOT EXISTS $table ($create_fields_str)"; 
    $pdo->exec($create_table_sql); 

    $insert_fields_str = join(', ', $fields); 
    $insert_values_str = join(', ', array_fill(0, count($fields), '?')); 
    $insert_sql = "INSERT INTO $table ($insert_fields_str) VALUES ($insert_values_str)"; 
    $insert_sth = $pdo->prepare($insert_sql); 

    $inserted_rows = 0; 
    while (($data = fgetcsv($csv_handle, 0, $delimiter)) !== FALSE) { 
     $insert_sth->execute($data); 
     $inserted_rows++; 
    } 

    $pdo->commit(); 

    fclose($csv_handle); 

    return array(
      'table' => $table, 
      'fields' => $fields, 
      'insert' => $insert_sth, 
      'inserted_rows' => $inserted_rows 
     ); 

} 
+0

为@保罗感谢编辑 –

+0

不客气。 – Paul

+0

非常感谢:) 选项数组如何看起来像? – iD4ve