2012-07-12 15 views
20

का उपयोग कर सीएसवी डेटा आयात करना मुझे CSV से डेटा आयात करने का प्रयास करने में कोई समस्या है और इस पर कुछ प्रश्न हैं कि मैंने अभी तक स्वयं को हल करने में कामयाब नहीं रहा है।PHP/MySQL

सबसे पहले यहाँ मदद करने के लिए परिप्रेक्ष्य में चीजों को डाल मेरी कोड है (यह थोड़ा ऊपर tidied, सीएसएस और डीबी कनेक्शन को हटाने):

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

यह मूल रूप से एक उदाहरण पर आधारित एक फिल्म मैं कई कई प्रयासों के बाद पाया है है विभिन्न तरीकों से।

मेरे सीएसवी डेटा के दो स्तंभ हैं, पहला नियम टेक्स्ट जा रहा है और दूसरी पूर्णांकों डेटाबेस में टेबल भी दो कॉलम, पहले कहा जाता है "पाठ" और दूसरा "संख्या"

तो है सवाल मैं कर रहे हैं:

  1. पाठ अपलोड किया जा रहा सिर्फ हर क्षेत्र में 0 के रूप में प्रदर्शित किया जा रहा है और यही कारण है
  2. मैं "में" संलग्न समाप्त डेटा के बारे में पढ़ रखने मुझे यकीन है कि नहीं हूँ, अगर ऐसा होता मैं इसे कैसे क्रमबद्ध करूं?
  3. मैं हेडर आदि के लिए सीएसवी की पहली एक्स लाइनों को कैसे अनदेखा कर सकता हूं?
  4. क्या इस प्रक्रिया में डेटा प्रारूप बदल गया है या क्या यह मेरे लिए ग्राफ में उपयोग करने के लिए तैयार है? जैसे एक बार दशमलव में डेटाबेस में रखा दशमलव दशमलव होगा?

मुझे लगता है कि सबकुछ शामिल है, किसी भी मदद के लिए अग्रिम धन्यवाद!

संपादित करें:

बस 10,000 रिकॉर्ड अपलोड करने का एक परीक्षण किया है और त्रुटि मिली:

"गंभीर त्रुटि: 30 सेकंड की अधिकतम निष्पादन समय से अधिक हो गई"

किसी भी विचार?

+2

आप एक बड़ी फ़ाइल अपलोड कर रहे हैं, यह भी पर एक नजर है [लोड डाटा INFILE] (http://dev.mysql.com/doc/refman/5.1/en/load-data.html) के रूप में यह बहुत तेज़ है। 'लोड डेटा इन्फाइल' /tmp/test.txt 'टैबलेट परीक्षण IGNORE 1 लाइनों में; ' – Fluffeh

+0

@Fluffeh मैंने उस विधि का उपयोग करने का प्रयास किया लेकिन किसी कारण से यह काम नहीं करेगा जब मैंने इसे PHP में शामिल किया था। गति निश्चित रूप से उपयोगी होगी क्योंकि यह अंत में एक बड़ी फाइल होगी। – Pidge

+0

मेरा अद्यतन उत्तर देखें। – jit

उत्तर

52

मैं सिर्फ दूसरे दिन एक लगभग समान प्रश्न का उत्तर दिया: Save CSV files into mysql database

MySQL एक सुविधा LOAD DATA INFILE, जो संसाधित करने के लिए यह जरूरत के बिना एक सीएसवी एक भी SQL क्वेरी में सीधे फ़ाइल आयात करने के लिए, की अनुमति देता है अपने 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

आशा में मदद करता है कि

+0

क्षमा करें, मैंने वेब के अपने scouring में भी सामना नहीं किया, जाहिर है कि मैं गलत बात खोज रहा था! तुम कहाँ मैं इसे डाल दिया है पर जांच करने के लिए मैं सदा आभारी अच्छा साहब :) (pastebin.com/e9wvsT4c) (बचत स्पैमिंग पाठ हर जगह फिर से) – Pidge

+1

अपने pastebin कोड के रूप में अगर लग रहा होगा शीघ्रता से अवलोकन मिलती तो आपको सही विचार मिल गया है। कुछ बग अभी भी मौजूद हैं (उदाहरण के लिए '$ 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

जिज्ञासा से, इसका क्या हिस्सा सीएसवी की पहली पंक्ति को अनदेखा कर रहा है? आपके कोड के साथ – Pidge

+0

कोड अंतर आपके उत्तर प्राप्त होगा। स्वीकृत उत्तर के रूप में उपयुक्त उत्तर स्वीकार करें – 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 रिकॉर्ड अपलोड करने का परीक्षण किया और त्रुटि मिली .." इस स्क्रिप्ट के साथ मैंने सीएसवी से 1 एम रिकॉर्ड आयात किए हैं। यह आपके लिए काम करना चाहिए। – dzeno

0

मैं मुख्य बातों सीएसवी पार्स करने के बारे में याद करने के लिए लगता है कि यह कुछ सरल नियमों का पालन करती है:

क) यह एक पाठ फ़ाइल इतना है आसानी से खोला बी) प्रत्येक पंक्ति को लाइन अंत द्वारा निर्धारित किया जाता है \ 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(); 
    } 

कोड सीएसवी फ़ाइल को पढ़ने और डेटाबेस में मेज पर अपलोड करने के लिए।

$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);