Импортировать файл CSV с полем, включая запятые в кавычках?

Я импортирую следующие данные из файла CSV, форматирование которого я абсолютно не контролирую:

CampaignName,"""keyword""",441,11683,3.77%,2.99,112.82,"1,318.02",1.7,12,109.84

Как видите, одно из полей имеет длинный номер с разделителем-запятой, хотя значение заключено в «…»

Данные импортируются в SQL с использованием следующего фрагмента кода:

        while (($data = fgetcsv($handle)) !== FALSE) {
$import="INSERT into ".$date."_keywords(Campaign,Keyword,Clicks,Impressions,CTR,CPC,CPM,Cost,Position,Conversions,Cost_per_conv) values('$data[0]','".mysql_real_escape_string($data[1])."','".mysql_real_escape_string($data[2])."','$data[3]','$data[4]','$data[5]','$data[6]','$data[7]','$data[8]','$data[9]','$data[10]')";
mysql_query($import) or die(mysql_error());
}

Даже если длинное число находится в кавычках, fgetcsv, похоже, не может его обработать, и в результате сохраняет число как 1 доллар и удаляет оставшуюся часть цитируемого текста.

Он правильно выбирает все оставшиеся поля — так что, похоже, он не просто предполагает, что это разделитель, а 318.02 — следующее значение.

Вопрос, как получить полный номер для добавления в базу данных?

Изменить: я прочитал другой поток о работе с запятыми в файлах CSV, и этот файл уже содержит данные в двойных кавычках, как предполагает этот поток, так что это не проблема.

0

Решение

Я не думаю, что есть какая-то проблема с разбором CSV. Это проблема приведения типов на уровне MySQL. Вам нужно убрать запятую из 1,318.02 перед вставкой в ​​ваш столбец типа float(9,2), Вы должны вставить 1318.02не 1,318.02,

Вместо:

... $data[8] ...

сделай это:

... str_replace(",", "", $data[8]) ...

Кстати, у вас могут быть некоторые SQL-инъекция Уязвимости в размещенном вами коде, в зависимости от источника данных CSV. Рекомендуется использовать подготовленные заявления PDO.

3

Другие решения

Не видя проблемы … На какой версии PHP вы работаете?

$crapData = 'CampaignName,"""keyword""",441,11683,3.77%,2.99,112.82,"1,318.02",1.7,12,109.84';

var_dump(str_getcsv($crapData));

Предоставляет мне следующий вывод:

array(11) {
[0]=>
string(12) "CampaignName"[1]=>
string(9) ""keyword""[2]=>
string(3) "441"[3]=>
string(5) "11683"[4]=>
string(5) "3.77%"[5]=>
string(4) "2.99"[6]=>
string(6) "112.82"[7]=>
string(8) "1,318.02"[8]=>
string(3) "1.7"[9]=>
string(2) "12"[10]=>
string(6) "109.84"

}

Можно увидеть это вживую Вот.

0