यदि आप echo($sql);
इसे निष्पादित करने से पहले आप देखेंगे कि आपकी क्वेरी का सिंटैक्स निम्नलिखित कारणों से गलत है:
-
फ़ाइल नाम को बैकटिक्स के बजाय उद्धरणों में संलग्न किया जाना चाहिए क्योंकि यह एक स्ट्रिंग अक्षर है जो पहचानकर्ता नहीं है।
-
mysql_escape_string()
. को कॉल करने की बिल्कुल आवश्यकता नहीं हैFIELDS TERMINATED BY
. में एक सीमांकक निर्दिष्ट करने के लिए औरENCLOSED BY
औरESCAPED BY
खंड। -
आप बैकटिक्स का अत्यधिक उपयोग करते हैं। वास्तव में आपके मामले में, चूंकि कोई आरक्षित शब्द इस्तेमाल नहीं किया गया है, आप उन सभी को छोड़ देते हैं। वे केवल अव्यवस्था जोड़ते हैं।
-
आपकी CSV फ़ाइल की पहली पंक्ति के अंत में आपको आपके पास होना चाहिए
,,,
क्योंकि आप उन्हें लाइन डिलीमीटर के हिस्से के रूप में उपयोग करते हैं। यदि आप ऐसा नहीं करेंगे तो आप न केवल पहली पंक्ति को छोड़ देंगे बल्कि दूसरी पंक्ति को भी छोड़ देंगे जिसमें डेटा शामिल है। -
आप
ENCLOSED BY
का उपयोग नहीं कर सकते हैं एक से अधिक बार खंड। आपकोNumber
. से निपटना होगा एक अलग तरीके से क्षेत्र। -
अपनी नमूना पंक्तियों को देखते हुए 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 आपको लोड करते समय कुछ फ़ील्ड बदलने की आवश्यकता है:
-
अगर
<ब्लॉकक्वॉट>date
आपकी तालिका मेंdatetime
. का है डेटा प्रकार तो इसे बदलने की जरूरत है, अन्यथा आपको एक त्रुटि मिलेगीगलत डेटाटाइम मान:'सितंबर-18-2013 01:53:45 अपराह्न' कॉलम 'तारीख' के लिए पंक्ति में
-
आपको
Number
. में मानों के इर्दगिर्द एकल qoutes से निपटना होगा फ़ील्ड -
आप संभवतः
"null"
change को बदलना चाहते हैं स्ट्रिंग अक्षरशः से वास्तविकNULL
addr, pin, city, state, country
. के लिए कॉलम -
यदि अवधि हमेशा सेकंड में होती है तो आप सेकंड का एक पूर्णांक मान निकाल सकते हैं और इसे अपनी तालिका में इस तरह संग्रहीत कर सकते हैं ताकि बाद में अवधि मानों को आसानी से एकत्र किया जा सके।
कहा जा रहा है कि कथन का उपयोगी संस्करण कुछ इस तरह दिखना चाहिए
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') ";