Pokud byste udělali echo($sql); než jej spustíte, uvidíte, že syntaxe vašeho dotazu je nesprávná z následujících důvodů:
-
Název souboru by měl být uzavřen v uvozovkách, nikoli zpětným zaškrtnutím, protože se jedná o řetězcový doslov, nikoli identifikátor.
-
Není absolutně nutné volat
mysql_escape_string()k určení oddělovače vFIELDS TERMINATED BYaENCLOSED BYaESCAPED BYklauzule. -
Nadměrně využíváte zpětné tahy. Ve skutečnosti ve vašem případě, protože nejsou použita žádná vyhrazená slova, je všechny zavrhnete. Přidávají jen nepořádek.
-
Na konci úplně prvního řádku vašeho souboru CSV, který musíte mít
,,,protože je používáte jako součást oddělovače řádků. Pokud to neuděláte, přeskočíte nejen první řádek, ale i druhý řádek, který obsahuje data. -
Nemůžete použít
ENCLOSED BYdoložka více než jednou. Musíte se vypořádat sNumberpole jiným způsobem. -
Když se podíváte na ukázkové řádky, IMHO nepotřebujete
ESCAPED BY. Ale pokud máte pocit, že to potřebujete, použijte to taktoESCAPED BY '\\'.
Jak bylo řečeno, syntakticky správný příkaz může vypadat takto
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)
Nyní IMHO potřebujete transformovat několik polí, zatímco je načítáte:
-
pokud
dateve vaší tabulce jedatetimedatový typ, pak je třeba jej transformovat, jinak se zobrazí chybaNesprávná hodnota data a času:'Sep-18-2013 01:53:45 PM' pro sloupec 'date' na řádku
-
musíte se vypořádat s jednotlivými qoutes kolem hodnot v
Numberpole -
pravděpodobně budete chtít změnit
"null"řetězec doslovný ke skutečnémuNULLproaddr, pin, city, state, countrysloupce -
pokud je trvání vždy v sekundách, můžete extrahovat celočíselnou hodnotu v sekundách a uložit ji tímto způsobem do tabulky, abyste mohli později snadno agregovat hodnoty trvání.
Užitečná verze prohlášení by měla vypadat nějak takto
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')
Níže je uveden výsledek provádění dotazu na mém počítači
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)
A nakonec v php přiřazení řetězce dotazu k $sql proměnná by měla vypadat takto
$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') ";