2015-06-01 7 views
0

Я ввожу следующие данные из файла 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-файлах, и этот файл уже содержит данные в двойных кавычках, как это предлагает этот поток, так что это не проблема.

+3

fgetcsv() имеет кучу дополнительных аргументов для определения разделителей, кавычек и т. Д. ... использовать их. –

+1

http://php.net/manual/en/function.fgetcsv.php –

+0

Я попытался использовать аргумент оболочки следующим образом: while (($ data = fgetcsv ($ handle, 1000, ",", "\" "))! == FALSE) { Не имеет значения – FarhadD

ответ

3

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

Вместо:

... $data[8] ... 

сделать это:

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

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

+1

Блестящий! Это сработало. Мне пришлось сделать следующее в инструкции insert: floatval (str_replace (',' , '', $ data [8])) – FarhadD

0

Не видя вопроса ... В какой версии 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" 

}

Можно видеть, что жить here.

+0

Данные извлекаются из загруженного CSV-файла. Не является ли fgetcsv предпочтительной функцией для синтаксического анализа файла? – FarhadD

+0

Кроме того, я просто дважды проверил SQL db, и он определенно импортировал номер как 1.00 вместо 1,318.02 – FarhadD

+0

Шесть из них, полдюжины других. – ficuscr

 Смежные вопросы

  • Нет связанных вопросов^_^