2016-09-20 4 views
0

私は非常に大きな.csvファイルを持っています。私はウェブサイトからダウンロードしてオンラインストアを作成します。 (エントリ数4,000、各フィールド数は10)非常に大きい.csvファイル。配列に変換して使用、またはデータベースに挿入

データを操作する必要があります(価格別、カテゴリ別など)。

この量のデータを処理する標準的な方法はありますか?

.csvファイルを読み込んでそれを配列に変換するのは非常に遅いです。

すべてのデータをSQLテーブルに挿入して通常どおりに使用するのが最善のようですが、数日おきにデータを再入力する必要があります。

アレイをディスクに直接保存することはできますが、それはテーブルより速いでしょうか?

+0

私はいつも考えているのは、テーブルがディスクから読み込み速度が速いということです。言い換えれば、あなたは道を離れて関係を築くことができ、SQLで操作を行うことができます。私はファイルを取得するためにカールのスクリプトを実行しているcronジョブでDenckerの答えを調べることをお勧めします。 – nerdlyist

+0

データベースの種類を指定してください:mysql、oracle、ms sqlserverなど – Barry

答えて

2

MySQLを使用していると仮定すると、LOAD DATA INFILEを見ることができます。あなたがする必要がある場合はFIELDS TERMINATED BYLINES TERMINATED BYでラインおよびフィールド区切り文字を指定することができ

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

:ような何か。

照会する必要のあるフィールドにインデックスを作成します。

各フィールドが1Gブロブでない限り、10個のフィールドを持つ4000個のエントリは実際には非常に小さなデータセットです。

0

あなただけのPDOは良い習慣である使用次..

<?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; 

を行うことができます...あなたはそれがどのように速くしてみてください。あなたのCSVに50,000以上のスクリプトがない限り、私はあなたに共有しますが、あなたが望むものとして完全に動作します。

CSVファイルがそれほど大きくない場合は、LOAD DATA INFILEを使用する必要はありません。特に、CSVからフェッチしている間にデータを挿入する前に余分な作業をしたい場合。

関連する問題