2012-07-12 20 views
20

CSVからデータをインポートしようとすると少し問題があり、まだ解決できていないという質問がいくつかあります。PHP/MySQLを使用したCSVデータのインポート

まず第一には、ここ(CSSとDBの接続を削除する、少しそれを片付け)視点で物事を置く助けるために私のコードです:

<body> 
<div id="container"> 
<div id="form"> 

<?php 
$deleterecords = "TRUNCATE TABLE tablename"; //empty the table of its current records 
mysql_query($deleterecords); 

//Upload File 
if (isset($_POST['submit'])) { 

    if (is_uploaded_file($_FILES['filename']['tmp_name'])) { 
     echo "<h1>" . "File ". $_FILES['filename']['name'] ." uploaded 
successfully." . "</h1>"; 
     echo "<h2>Displaying contents:</h2>"; 
     readfile($_FILES['filename']['tmp_name']); 
    } 

    //Import uploaded file to Database 
    $handle = fopen($_FILES['filename']['tmp_name'], "r"); 

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     $import="INSERT into importing(text,number)values('$data[0]','$data[1]')"; 

     mysql_query($import) or die(mysql_error()); 
    } 

    fclose($handle); 

    print "Import done"; 

//view upload form 
} else { 

    print "Upload new csv by browsing to file and clicking on Upload<br />\n"; 

    print "<form enctype='multipart/form-data' action='upload.php' method='post'>"; 

    print "File name to import:<br />\n"; 

    print "<input size='50' type='file' name='filename'><br />\n"; 

    print "<input type='submit' name='submit' value='Upload'></form>"; 

} 

?> 

</div> 
</div> 
</body> 

それは基本的に、私は多くの多くの試みの後に発見した例の適応です様々な方法で。

私のCSVは、データの2つの列、テキストである第1の1を有し、第2のデータベース内のテーブルもそう二つの列、最初に呼ばれる「テキスト」と第二の「数」

を持って の整数であります私が持っている質問は以下のとおりです。

  1. アップロードされているテキストだけですべてのフィールドに0と表示されており、それが起こる場合、私は、「」で囲んを終わるデータについて読み続ける理由
  2. 私はわからないんだけどどうやってソートするの?
  3. ヘッダーなどのCSVの最初のX行を無視するにはどうすればよいですか?
  4. は、このプロセス全体を通じて変更されたデータ形式ですか、グラフで使用する準備ができていますか?例えば一度データベースに置かれると小数点は小数点に留まるでしょうか?

私はあらゆることをカバーしていると思います。

EDIT:

ちょうど万レコードのアップロードのテストを行って、エラーました:

「致命的なエラー:30秒の最大実行時間を超え、」

任意の考え?

+2

あなたに[読み込みデータINFILE](http://dev.mysql.com/doc/refman/5.1/en/load-data.html)を見ても、大きなファイルをアップロードする場合それはずっと速いです。 'LOAD DATA INFILE' /tmp/test.txt 'INTO TABLEテスト無視する1行;' – Fluffeh

+0

@Fluffeh 私はその方法を使ってみましたが、何らかの理由でそれをPHPに組み込んでも機能しませんでした。最終的に大きなファイルになるので、速度は間違いなく便利です。 – Pidge

+0

私の更新された答えをチェックしてください。 – jit

答えて

52

私は先日実質的に同一の質問に答えた:Save CSV files into mysql database

MySQLは、それが処理されることを必要とせず、単一のSQLクエリで直接CSVファイルをインポートすることを可能にする機能LOAD DATA INFILEを、持っていますあなたのPHPプログラムを経由してループします。

簡単な例:

<?php 
$query = <<<eof 
    LOAD DATA INFILE '$fileName' 
    INTO TABLE tableName 
    FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"' 
    LINES TERMINATED BY '\n' 
    (field1,field2,field3,etc) 
eof; 

$db->query($query); 
?> 

それはそれと同じくらい簡単です。

ループはありません。そして多くの場合、はPHPで解析するよりも速くです。

ここでMySQLのマニュアルページ:http://dev.mysql.com/doc/refman/5.1/en/load-data.html

希望私はcsvファイルの構文解析について覚えておくべき主なものは、それはいくつかの簡単なルールに従うことだと思います

+0

申し訳ありませんが、私はウェブの精練に遭遇していませんでしたが、明らかに間違ったことを探していました! あなたは私は永遠に感謝し良い先生になり、それを入れているところでチェックする迅速な顔をしていることができれば:) (pastebin.com/e9wvsT4c) (再びどこでもスパムのテキストを保存する) – Pidge

+1

あなたペーストビンコードがあるかのように見えますあなたは正しい考えを持っています。いくつかのバグがまだ残っています(例えば '$ filename'は設定されていません)。 – SDC

+0

助けてくれてありがとう! :) – Pidge

6
$i=0; 
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
if($i>0){ 
    $import="INSERT into importing(text,number)values('".$data[0]."','".$data[1]."')"; 
    mysql_query($import) or die(mysql_error()); 
} 
$i=1; 
} 
+0

テキストの問題を修正しました:) – Pidge

+0

好奇心の疎外感から、CSVの最初の行を無視する部分は何ですか? – Pidge

+0

あなたのコードでcode diffを実行すると、あなたの答えが得られます。 – jit

1

letsay $ infile = a.csv //ファイルをインポートする必要があります。

class blah 
{ 
static public function readJobsFromFile($file) 
{    
    if (($handle = fopen($file, "r")) === FALSE) 
    { 
     echo "readJobsFromFile: Failed to open file [$file]\n"; 
     die; 
    } 

    $header=true; 
    $index=0; 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
    { 
     // ignore header 
     if ($header == true) 
     { 
      $header = false; 
      continue; 
     } 

     if ($data[0] == '' && $data[1] == '') //u have oly 2 fields 
     { 
      echo "readJobsFromFile: No more input entries\n"; 
      break;       
     }    


     $a  = trim($data[0]); 
     $b = trim($data[1]);     





     if (check_if_exists("SELECT count(*) FROM Db_table WHERE a='$a' AND b='$b'") === true) 
     { 

       $index++; 
      continue;  
     }    

     $sql = "INSERT INTO DB_table SET a='$a' , b='$b' "; 
     @mysql_query($sql) or die("readJobsFromFile: " . mysql_error());    
     $index++; 
    } 

    fclose($handle);   
    return $index; //no. of fields in database. 
} 
function 
check_if_exists($sql) 
{ 
$result = mysql_query($sql) or die("$sql --" . mysql_error()); 
if (!$result) { 
    $message = 'check_if_exists::Invalid query: ' . mysql_error() . "\n"; 
    $message .= 'Query: ' . $sql; 
    die($message); 
} 

$row = mysql_fetch_assoc ($result); 
$count = $row['count(*)']; 
if ($count > 0) 
    return true; 
return false; 
} 

$infile=a.csv; 
blah::readJobsFromFile($infile); 
} 

これが役に立ちます。

2
set_time_limit(10000); 

$con = mysql_connect('127.0.0.1','root','password'); 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 

mysql_select_db("db", $con); 

$fp = fopen("file.csv", "r"); 

while(!feof($fp)) { 
    if(!$line = fgetcsv($fp, 1000, ';', '"')) { 
    continue; 
    } 

    $importSQL = "INSERT INTO table_name VALUES('".$line[0]."','".$line[1]."','".$line[2]."')"; 

    mysql_query($importSQL) or die(mysql_error()); 

} 

fclose($fp); 
mysql_close($con); 
+0

@Pidge「10,000レコードのアップロードを試しただけでエラーが発生しました..」このスクリプトでは、私はCSVから1Mレコードをインポートしています。それはあなたのために働くはずです。 – dzeno

0

を支援します。

a)はそのようにテキストファイルです簡単に開けた b)各行は行末\ nで決まるので、最初に行に分割する c)各行/行にはコンマで区切られた列があるので、各行を分割して列の配列を得る

have a read of this post私が話していることを見る

あなたはそれを掛けてしまえば非常に便利になるはずです。

0

データベース接続:

try { 
     $conn = mysqli_connect($servername, $username, $password, $db); 
     //echo "Connected successfully"; 
    } catch (exception $e) { 
     echo "Connection failed: " . $e->getMessage(); 
    } 

コードCSVファイルを読み込み、データベースのテーブルにアップロードします。

$file = fopen($filename, "r"); 
      while (($getData = fgetcsv($file, 10000, ",")) !== FALSE) { 
       $sql = "INSERT into db_table 
        values ('','" . $getData[1] . "','" . $getData[2] . "','" . $getData[3] . "','" . $getData[4] . "','" . $getData[5] . "','" . $getData[6] . "')"; 
       $result = mysqli_query($conn, $sql); 
       if (!isset($result)) { 
        echo "<script type=\"text/javascript\"> 
          alert(\"Invalid File:Please Upload CSV File. 
          window.location = \"home.do\" 
          </script>"; 
       } else { 
        echo "<script type=\"text/javascript\"> 
         alert(\"CSV File has been successfully Imported.\"); 
         window.location = \"home.do\" 
        </script>"; 
       } 
      } 
      fclose($file); 
関連する問題