Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP - लोड डेटा INFILE का उपयोग करके mysql डेटाबेस में CSV फ़ाइल आयात करें

यदि आप echo($sql); इसे निष्पादित करने से पहले आप देखेंगे कि आपकी क्वेरी का सिंटैक्स निम्नलिखित कारणों से गलत है:

  1. फ़ाइल नाम को बैकटिक्स के बजाय उद्धरणों में संलग्न किया जाना चाहिए क्योंकि यह एक स्ट्रिंग अक्षर है जो पहचानकर्ता नहीं है।

  2. mysql_escape_string() . को कॉल करने की बिल्कुल आवश्यकता नहीं है FIELDS TERMINATED BY . में एक सीमांकक निर्दिष्ट करने के लिए और ENCLOSED BY और ESCAPED BY खंड।

  3. आप बैकटिक्स का अत्यधिक उपयोग करते हैं। वास्तव में आपके मामले में, चूंकि कोई आरक्षित शब्द इस्तेमाल नहीं किया गया है, आप उन सभी को छोड़ देते हैं। वे केवल अव्यवस्था जोड़ते हैं।

  4. आपकी CSV फ़ाइल की पहली पंक्ति के अंत में आपको आपके पास होना चाहिए ,,, क्योंकि आप उन्हें लाइन डिलीमीटर के हिस्से के रूप में उपयोग करते हैं। यदि आप ऐसा नहीं करेंगे तो आप न केवल पहली पंक्ति को छोड़ देंगे बल्कि दूसरी पंक्ति को भी छोड़ देंगे जिसमें डेटा शामिल है।

  5. आप ENCLOSED BYका उपयोग नहीं कर सकते हैं एक से अधिक बार खंड। आपको Number . से निपटना होगा एक अलग तरीके से क्षेत्र।

  6. अपनी नमूना पंक्तियों को देखते हुए IMHO आपको ESCAPED BY की आवश्यकता नहीं है . लेकिन अगर आपको लगता है कि आपको इसकी आवश्यकता है तो इसका उपयोग इस तरह करें ESCAPED BY '\\'

कहा जा रहा है कि वाक्य रचना की दृष्टि से सही कथन ऐसा दिखाई दे सकता है

LOAD DATA INFILE 'detection.csv'
INTO TABLE calldetections
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY ',,,\r\n'
IGNORE 1 LINES 
(date, name, type, number, duration, addr, pin, city, state, country, lat, log)

अब IMHO आपको लोड करते समय कुछ फ़ील्ड बदलने की आवश्यकता है:

  1. अगर date आपकी तालिका में datetime . का है डेटा प्रकार तो इसे बदलने की जरूरत है, अन्यथा आपको एक त्रुटि मिलेगी

    <ब्लॉकक्वॉट>

    गलत डेटाटाइम मान:'सितंबर-18-2013 01:53:45 अपराह्न' कॉलम 'तारीख' के लिए पंक्ति में

  2. आपको Number . में मानों के इर्दगिर्द एकल qoutes से निपटना होगा फ़ील्ड

  3. आप संभवतः "null" change को बदलना चाहते हैं स्ट्रिंग अक्षरशः से वास्तविक NULL addr, pin, city, state, country . के लिए कॉलम

  4. यदि अवधि हमेशा सेकंड में होती है तो आप सेकंड का एक पूर्णांक मान निकाल सकते हैं और इसे अपनी तालिका में इस तरह संग्रहीत कर सकते हैं ताकि बाद में अवधि मानों को आसानी से एकत्र किया जा सके।

कहा जा रहा है कि कथन का उपयोगी संस्करण कुछ इस तरह दिखना चाहिए

LOAD DATA INFILE 'detection.csv'
INTO TABLE calldetections
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY ',,,\r\n'
IGNORE 1 LINES 
(@date, name, type, @number, @duration, @addr, @pin, @city, @state, @country, lat, log)
SET date = STR_TO_DATE(@date, '%b-%d-%Y %h:%i:%s %p'),
    number = TRIM(BOTH '\'' FROM @number),
    duration = 1 * TRIM(TRAILING 'Secs' FROM @duration),
    addr = NULLIF(@addr, 'null'),
    pin  = NULLIF(@pin, 'null'),
    city = NULLIF(@city, 'null'),
    state = NULLIF(@state, 'null'),
    country = NULLIF(@country, 'null') 

नीचे मेरी मशीन पर क्वेरी निष्पादित करने का परिणाम है

mysql> LOAD DATA INFILE '/tmp/detection.csv'
    -> INTO TABLE calldetections
    -> FIELDS TERMINATED BY ','
    -> OPTIONALLY ENCLOSED BY '"' 
    -> LINES TERMINATED BY ',,,\n'
    -> IGNORE 1 LINES 
    -> (@date, name, type, @number, @duration, @addr, @pin, @city, @state, @country, lat, log)
    -> SET date = STR_TO_DATE(@date, '%b-%d-%Y %h:%i:%s %p'),
    ->     number = TRIM(BOTH '\'' FROM @number),
    ->     duration = 1 * TRIM(TRAILING 'Secs' FROM @duration),
    ->     addr = NULLIF(@addr, 'null'),
    ->     pin  = NULLIF(@pin, 'null'),
    ->     city = NULLIF(@city, 'null'),
    ->     state = NULLIF(@state, 'null'),
    ->     country = NULLIF(@country, 'null');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from calldetections;
+---------------------+---------+---------------+-------------+----------+------+------+------+-------+---------+------+------+
| date                | name    | type          | number      | duration | addr | pin  | city | state | country | lat  | log  |
+---------------------+---------+---------------+-------------+----------+------+------+------+-------+---------+------+------+
| 2013-09-18 13:53:45 | Unknown | outgoing call | 123456      |        0 | NULL | NULL | NULL | NULL  | NULL    | 0.0  | 0.0  |
| 2013-09-18 13:54:14 | Unknown | outgoing call | 1234567890  |        0 | NULL | NULL | NULL | NULL  | NULL    | 0.0  | 0.0  |
| 2013-09-18 13:54:37 | Unknown | outgoing call | 14772580369 |        1 | NULL | NULL | NULL | NULL  | NULL    | 0.0  | 0.0  |
+---------------------+---------+---------------+-------------+----------+------+------+------+-------+---------+------+------+
3 rows in set (0.00 sec)

और अंत में PHP में $sql . को एक क्वेरी स्ट्रिंग असाइन करना चर इस तरह दिखना चाहिए

$sql = "LOAD DATA INFILE 'detection.csv'
        INTO TABLE calldetections
        FIELDS TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '\"' 
        LINES TERMINATED BY ',,,\\r\\n'
        IGNORE 1 LINES 
        (@date, name, type, @number, @duration, @addr, @pin, @city, @state, @country, lat, log)
        SET date = STR_TO_DATE(@date, '%b-%d-%Y %h:%i:%s %p'),
            number = TRIM(BOTH '\'' FROM @number),
            duration = 1 * TRIM(TRAILING 'Secs' FROM @duration),
            addr = NULLIF(@addr, 'null'),
            pin  = NULLIF(@pin, 'null'),
            city = NULLIF(@city, 'null'),
            state = NULLIF(@state, 'null'),
            country = NULLIF(@country, 'null') ";


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL त्रुटि 1064 सिंटैक्स लेकिन सब कुछ ठीक लगता है

  2. MySQL - फिक्स एरर - वर्डप्रेस डेटाबेस एरर डुप्लीकेट एंट्री कुंजी के लिए प्राथमिक क्वेरी के लिए सम्मिलित करें wp_options में

  3. PHP/MySQL का उपयोग करके CSV डेटा आयात करना

  4. MySQL मैच () के खिलाफ () - प्रासंगिकता और कॉलम द्वारा आदेश?

  5. MySQL में संग्रहीत प्रक्रियाओं के भीतर वैकल्पिक पैरामीटर लिखना?