2014-06-27 172 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