2016-09-20 35 views
0

我有一個非常大的.csv文件,我從網站下載以填充在線商店。 (4千條目,每個10個字段)非常大的.csv文件。轉換爲數組並使用,或插入Databsase

我需要能夠操縱數據(按價格排序,按類別顯示等)。

是否有關於如何處理這些數據量的標準做法?

讀取.csv文件並將其轉換爲數組非常緩慢。

似乎最好將所有數據插入到SQL表中,並將其作爲正常使用,但我必須每隔幾天重新填充一次。

我可以直接將數組保存到磁盤嗎?它會比表更快嗎?

+0

我認爲通常的想法是,從磁盤讀取表格會更快。更不用說它給了你關係,並且可以在SQL中進行操作。我建議用一個用curl運行腳本來獲取文件的cron作業來查看Dencker的答案。 – nerdlyist

+0

請修改以指定數據庫類型:mysql,oracle,ms sqlserver等 – Barry

回答

2

假設你使用MySQL,你可以看看LOAD DATA INFILE。喜歡的東西:

LOAD DATA INFILE 'path/to/your/file.csv' INTO your_table; 

如果需要,您可以指定FIELDS TERMINATED BYLINES TERMINATED BY線路和字段分隔符。

在需要查詢的字段上創建索引。

在旁註中,每個有10個字段的4000個條目實際上是一個非常小的數據集 - 除非當然每個字段都是1G的blob。

0

你可以做以下..

<?php 

try{ 

$handler = fopen('pathtoFile','r'); 
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); 

// set the PDO error mode to exception 
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
// prepare sql and bind parameters 
$stmt = $conn->prepare("INSERT INTO YOURTABLE(firstname, lastname, email) VALUES (:firstname, :lastname, :email)"); 

$stmt->bindParam(':firstname', $firstname); 
$stmt->bindParam(':lastname', $lastname); 
$stmt->bindParam(':email', $email); 

while(($row = fgetcsv($handler,1000)) !== FALSE){ 

    // insert a row 
    $firstname = $row[0]; 
    $lastname = $row[1]; 
    $email = $row[2]; 
    $stmt->execute(); 

} 

} catch(PDOException $e) 
    { 
    echo "Error: " . $e->getMessage(); 
    } 
$conn = null; 

使用PDO是一個很好的做法......你可以試試它的速度有多快。只要您的CSV不會超過50,000個,我分享給您的腳本就會按照您的要求完美工作。

如果您的CSV文件不是那麼大,則不需要使用LOAD DATA INFILE。特別是如果你想在從CSV中讀取數據的同時插入數據之前做額外的工作。

相關問題