我有一個非常大的.csv文件,我從網站下載以填充在線商店。 (4千條目,每個10個字段)非常大的.csv文件。轉換爲數組並使用,或插入Databsase
我需要能夠操縱數據(按價格排序,按類別顯示等)。
是否有關於如何處理這些數據量的標準做法?
讀取.csv文件並將其轉換爲數組非常緩慢。
似乎最好將所有數據插入到SQL表中,並將其作爲正常使用,但我必須每隔幾天重新填充一次。
我可以直接將數組保存到磁盤嗎?它會比表更快嗎?
我有一個非常大的.csv文件,我從網站下載以填充在線商店。 (4千條目,每個10個字段)非常大的.csv文件。轉換爲數組並使用,或插入Databsase
我需要能夠操縱數據(按價格排序,按類別顯示等)。
是否有關於如何處理這些數據量的標準做法?
讀取.csv文件並將其轉換爲數組非常緩慢。
似乎最好將所有數據插入到SQL表中,並將其作爲正常使用,但我必須每隔幾天重新填充一次。
我可以直接將數組保存到磁盤嗎?它會比表更快嗎?
假設你使用MySQL,你可以看看LOAD DATA INFILE
。喜歡的東西:
LOAD DATA INFILE 'path/to/your/file.csv' INTO your_table;
如果需要,您可以指定FIELDS TERMINATED BY
和LINES TERMINATED BY
線路和字段分隔符。
在需要查詢的字段上創建索引。
在旁註中,每個有10個字段的4000個條目實際上是一個非常小的數據集 - 除非當然每個字段都是1G的blob。
你可以做以下..
<?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中讀取數據的同時插入數據之前做額外的工作。
我認爲通常的想法是,從磁盤讀取表格會更快。更不用說它給了你關係,並且可以在SQL中進行操作。我建議用一個用curl運行腳本來獲取文件的cron作業來查看Dencker的答案。 – nerdlyist
請修改以指定數據庫類型:mysql,oracle,ms sqlserver等 – Barry