2012-07-11 93 views
0

我在目錄中有很多csv文件。有了這些文件,我必須編寫一個腳本,將他們的內容放在我的數據庫的正確字段和表中。我幾乎是php語言的初學者:我在互聯網上找到了一些代碼。它似乎工作,但我堅持在一個階段。有些話題與本網站相關,但我沒有找到ecat問題。將CSV文件保存到mysql數據庫

我寫了一個php腳本,允許獲取路徑和這些文件的名稱。我管理的也是創建一個名稱取決於每個csv的表(例如:file'data_1.csv'在my-sql中給出表data_1.csv)。所有的表都有三個相同的字段,id,url,value。 要做的最後一件事是填充這些表,通過讀取每個文件並將由'|'字符分隔的值放在正確的表中。例如,如果「data_1.csv」的線是

8756 | HTTTP://示例.com |東西寫

我想獲得一個紀錄data_1.csv表,其中8756是ID ,url字段中的htttp://example.com,以及值域中的內容。 我已經找到了用fcsvget函數讀取和打印這些csv的方法。但我不知道如何使這些行進入SQL數據庫。有人能幫我解決這個問題嗎?

這裏是我的腳本如下

<?php 
ini_set('max_execution_time', 300); 
$dbhost = 'localhost'; 
$dbuser = 'root'; 
$dbpass = ''; 
$conn = mysql_connect($dbhost, $dbuser, $dbpass, true) or die      ('Error connecting to mysql'); 
$dbname = 'test_database'; 

mysql_select_db($dbname); 


$bdd = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); 
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname); 
if (mysqli_connect_errno()) { 
printf("Connect failed: %s\n", mysqli_connect_error()); 
exit(); 
} 
else { 
echo "hello <br>"; 
} 

$dir = 'C:\wamp\www\test'; 
$imgs = array(); 

if ($dh = opendir($dir)) { 
while (($file = readdir($dh)) !== false) { 
    if (!is_dir($file) && preg_match("/\.(csv)$/", $file)) { 
     array_push($imgs, $file); 
     } 
    } 

    closedir($dh); 
} else { 
    die('cannot open ' . $dir); 
} 
foreach ($imgs as $idx=>$img) { 
    $class = ($idx == count($imgs) - 1 ? ' class="last"' : ''); 
    $filePath=$dir . '\\'. $img; 
    $file = fopen($filePath, "r") or exit("Unable to open file!"); 
    $nom = 'FILE: ' . $dir . '\\'. $img; 
    echo $nom; 
    settype($nom, "string"); 
    echo '<br>'; 
    $chemin = '<img src="' . $dir . $img . '" alt="' . 
     $img . '"' . $class . ' />' . "\n"; 
    echo $chemin; 
    $file_name = basename($filePath); 
    $sql = 'CREATE TABLE `' . $file_name . '` (id int(20000), url varchar(15), value TEXT)'; 
    mysql_query($sql,$conn); 
    $handle = fopen($filePath, 'r'); 
    while (($row = fgetcsv($handle)) !== false) { 
    foreach ($row as $field) { 
    echo $field . '<br />'; 
} 
} 
fclose($handle); 

} 

echo ("VERIFY"); 
for ($i = 1; $i <= 1682; $i++) { 
    echo ("<br>A : " . $i); 
    $checkRequest= "select * from movies where movieID='". $i."'"; 
    echo ("<br>". $checkRequest); 
    if ($result = $mysqli->query($checkRequest)) { 
    printf("<br> Select ". $i ."returned %d rows.\n", $result->num_rows); 
    if ($result->num_rows == 0) { 

        echo ("I : " . $i); 
      } 



$result->close(); 
    } 
} 

$mysqli->close(); 

?> 
+4

請不要使用' mysql_ *'用於新代碼。他們不再被維護,社區已經開始[棄用流程](http://goo.gl/KJveJ)。請參閱[**紅框**](http://goo.gl/GPmFd)?相反,您應該瞭解[準備好的語句](http://goo.gl/vn8zQ)並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli的)。如果你不能決定,[本文](http://goo.gl/3gqF9)將有助於選擇。如果你關心學習,[這裏是很好的PDO教程](http://goo.gl/vFWnC)。 – 2012-07-11 12:20:03

回答

8

MySQL提供了一個奇妙的功能,使您可以導入CSV文件直接,在一個單一的查詢。

你正在尋找的SQL命令是LOAD DATA INFILE

手冊頁面在這裏:http://dev.mysql.com/doc/refman/5.1/en/load-data.html

簡單的例子:

LOAD DATA INFILE 'fileName' 
INTO TABLE tableName 
FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
(
field1, 
field2, 
field3, 
@variable1, 
@variable2, 
etc 
) 
set 
(
field4 = concat(@variable1,@variable2) 
); 

這是一個非常簡單的例子,但它涵蓋了大部分的你'想要。手冊頁給出瞭如何用它做一些非常複雜的事情的全部細節。

希望有所幫助。

+0

謝謝大家!我立即測試這些代碼 – user1474018 2012-07-11 13:03:29

+0

@ user1474018:這太好了。如果它適合您,請將您使用的答案標記爲「已接受」(即單擊勾號圖標)。 :-) – SDC 2012-07-11 13:22:09

+0

加載數據INFILE本身的作品,但我有很多文件,我必須將其嵌入到我的PHP腳本中。我試圖添加代碼,但行並未添加到我的數據庫中。但也許我應該開一個新的話題? :\t \t $ sqltwo =「LOAD DATA LOCAL INFILE '$文件路徑' INTO TABLE $ FILE_NAME \t \t FIELDS \t \t \t TERMINATED BY '|' \t \t \t ESCAPED BY '\\\' \t \t LINES \t \t \t STARTING BY '' \t \t \t TERMINATED BY '\\ N'(ID,URL,值)」或死亡(mysql_error()); – user1474018 2012-07-11 14:34:47

0

foreach ($row as $field) { 
echo $field . '<br />'; 

你需要;等之後解析結果:

$pieces = explode(";", $field); 

,然後每一塊插入到數據庫

$sql = ' INSERT INTO X VALUES ("'.$pieces[0].'","'.$pieces[1].'","'.$pieces[2].'","'.$pieces[3].'","'.$pieces[4].'")'; 
mysql_query($sql, $conn);