Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Игнорируется последнее поле при разборе CSV файла

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Evgeniii
Отправлено: 23 Января, 2017 - 00:56:54
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Янв. 2017  


Помог: 0 раз(а)




Есть скрипт, который разбирает из CSV файла данные.

CSV фал выглядит следующим образом:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Категория;"Название товара";Производитель;"Цена товара";"Количество на складе";"Ссылка на фотографию (big)";"Ссылка для покупки товара";"Краткое описание";"Полное описание";"Ссылка на фото (small)";Активность;Идентификатор
  2. Bigger;"Soft";"Orion";45.94;10;http://www.ez.by/uplo1b167c898391dac19.jpg;http://www.ez.by/soft/;"Маленькое описание...";"Большое описание";;on;5663060000


Последнее поле с идентификатором не обрабатывается. Если после идентификатора добавить разделитель ";", то есть сделать его не последним стобцом, то данные из него обрабатываются.

Как заставить обрабатывать информацию в последнем столбце?

Заранее спасибо.

PHP:
скопировать код в буфер обмена
  1. if((($handle = fopen($local, "r")) !== FALSE) && $r) {
  2.  
  3.           $headers = fgetcsv($handle, 0, ';', '"');
  4.          
  5.           if ((int) $this->request->post['pointer'] == '0' ) { // Если это первая цикл - обнуляем количество товара
  6.             if (!$this->request->post['reset_qty']) {
  7.               $this->model_catalog_csvsynchroniz->resetQantity($shopname);//Обнуляем количество товара
  8.             }
  9.           }else{
  10.             fseek($handle,$this->request->post['pointer']);// Если не первый - выставляем указатель на то место где закончили
  11.           }
  12.  
  13.           $k = 0;
  14.           while((($data = $FGetCSV->fgetcsv($handle, 30000, ';', '"')) !== FALSE ) && ($k < $inpart_quantity)) {
  15.             $num = count($data);
  16.             $pairs = array();
  17.  
  18.             $product_model = $data[$this->request->post['model_number']];
  19.  
  20.             if ($product_model != '') {
  21.               $p_exist = $this->model_catalog_csvsynchroniz->productExist($product_model, $shopname);//Проверяем существование товара
  22.  
  23.               if ($p_exist->row){// Если существует делаем обновление
  24.                 $data_old = array();
  25.                 $product_id = $p_exist->row['product_id'];
  26.                 $update_data = $this->get_data($headers,$data,$num,$product_model,$data_old,$nacenka,$optprice,$this->request->post);//Меняем поля из файла csv
  27.  
  28.                 $this->model_catalog_csvsynchroniz->updateProduct($update_data,$product_id);
  29.               }
  30.             /*  else { // Если нет - создаем новый
  31.                 $default_data = $this->default_data($product_model);//Заливаем дефолтные данные товара
  32.                 $add_data = $this->get_data($headers,$data,$num,$product_model,$default_data,$nacenka,$this->request->post);//Меняем поля из файла csv
  33.                 $this->model_catalog_product->addProduct($add_data);
  34.               } */
  35.             }                                          
  36.             $k++;
  37.           }
  38.           $pointer = ftell($handle);
  39.           $eof_flag = feof($handle) + 0;
  40.           fclose($handle);
  41.           $json['info'] = sprintf($this->language->get("text_updated"), $k+1);
  42.           $json['updated'] = $k;
  43.           $json['pointer'] = $pointer;
  44.           $json['eof_flag'] = $eof_flag;
  45.  
  46.           $this->cache->delete('product');
  47.         } else {
  48.  
  49.           $json['warning'] = $this->language->get('file_error');
  50.  
  51.         }
 
 Top
skruglikov
Отправлено: 23 Января, 2017 - 06:00:35
Post Id



Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Янв. 2017  
Откуда: Киев, Украина


Помог: 1 раз(а)




я думаю, нужно начать с проверки объекта/массива $data... посмотреть что туда вообще попало из вашего csv-файла, а потом уже смотреть дальше.
и приведите в порядок сам csv-файл, если вы уже используете символ ограничителя поля, в вашем случае "двойная кавычка (универсальная)", то кавычки должны ограничивать все значения.
 
 Top
Evgeniii
Отправлено: 23 Января, 2017 - 12:02:01
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Янв. 2017  


Помог: 0 раз(а)




Привести в порядок csv файл не могу, т.к он скачивается с сервера поставщика.
Возможно ли как-то в конце каждой строки добавлять ; и далее уже обрабатывать измененный файл?
 
 Top
skruglikov
Отправлено: 23 Января, 2017 - 12:30:15
Post Id



Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Янв. 2017  
Откуда: Киев, Украина


Помог: 1 раз(а)




Evgeniii пишет:
Привести в порядок csv файл не могу, т.к он скачивается с сервера поставщика

обработку строк можно сделать сразу после открытия файла, если вы не участвуете в скачивании файла... с помощью регулярных выражений проверить наличие "кавычек", если что добавить их;

Evgeniii пишет:
Возможно ли как-то в конце каждой строки добавлять ; и далее уже обрабатывать измененный файл?

собственно да, опять же, с помощью регулярных выражений проверить наличие "точка с запятой", если что добавить их;

но перед тем как это делать, рекомендую проверить содержимое переменной $data перед строкой №15 вашего кода
 
 Top
Evgeniii
Отправлено: 23 Января, 2017 - 17:05:00
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Янв. 2017  


Помог: 0 раз(а)




skruglikov пишет:
но перед тем как это делать, рекомендую проверить содержимое переменной $data перед строкой №15 вашего кода


Содержимое переменной следующее
CODE (htmlphp):
скопировать код в буфер обмена
  1. Array ( [0] => Категория [1] => Название товара [2] => Производитель [3] => Цена товара [4] => Количество на складе [5] => Ссылка на фотографию (big) [6] => Ссылка для покупки товара [7] => Краткое описание [8] => Полное описание [9] => Ссылка на фото (small) [10] => Активность [11] => Идентификатор ) Array ( [0] => Bigger [1] => Soft [2] => Orion [3] => 45.94 [4] => 10 [5] => www.ez.by/uplo1b167c898391dac19.jpg [6] => http://www.ez.by/soft/ [7] => Маленькое описание... [8] =>Большое описание [9] => [10] => on [11] => 5663060000 )
 
 Top
Evgeniii
Отправлено: 23 Января, 2017 - 19:13:56
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Янв. 2017  


Помог: 0 раз(а)




Сломал всю голову уже...
Написал небольшой скрипт
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $fh = fopen ( 'CSV.csv', 'r' );
  3. $k = 0;
  4. while ( ( $info = fgetcsv ($fh, 1000, ";") ) !== false )
  5. {
  6. $product_model = $info[11];
  7. $fp = fopen('file.csv', 'w');
  8. fputcsv($fp, array($product_model));
  9. fclose($fp);
  10. $k++;
  11. print_r($product_model);
  12. }                      
  13. fclose ( $fh );
  14. ?>


print_r показывает все данные из 11 строки файла CSV.csv как надо
CODE (htmlphp):
скопировать код в буфер обмена
  1. Идентификатор56630600006171050000560278000061760100006203000000

Но при выполнении fputcsv в файл записывается только дынные из последней строки, а именно
Почему так?
 
 Top
skruglikov
Отправлено: 23 Января, 2017 - 19:29:57
Post Id



Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Янв. 2017  
Откуда: Киев, Украина


Помог: 1 раз(а)




у вас в массиве присутствует идентификатор... отлично!
а теперь можете объяснить, что вы имеете ввиду, когда говорите:
Evgeniii пишет:
поле с идентификатором не обрабатывается


в чем заключается обработка?

Evgeniii пишет:
Но при выполнении fputcsv в файл записывается только дынные из последней строки

в 7 строке поменяйте 'w'=>'a'

Список возможных режимов для fopen() используя mode
http://php.net/manual/ru/function.fopen.php

(Отредактировано автором: 23 Января, 2017 - 19:32:53)

 
 Top
Evgeniii
Отправлено: 25 Января, 2017 - 11:01:36
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Янв. 2017  


Помог: 0 раз(а)




skruglikov пишет:
в 7 строке поменяйте 'w'=>'a'

Спасибо! Теперь записывается как надо.
Теперь вопрос, как к каждой строке добавить в конце разделитель ;

Код выглядит так:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $fh = fopen ( 'CSV.csv', 'r' );
  3. $k = 0;
  4. while ( ( $info = fgetcsv ($fh, 1000, ";") ) !== false )
  5. {
  6. $fp = fopen('file.csv', 'a');
  7. fputcsv($fp, $info, ";");
  8. fclose($fp);
  9. $k++;
  10. print_r($info);
  11. }                      
  12. fclose ( $fh );
  13. ?>


Файл читается и записывается, но в конце каждой строки после идентификатора нет разделителя, как мне его добавить при записи?

Вот так выглядит то, что записывается
CODE (htmlphp):
скопировать код в буфер обмена
  1. Категория;"Название товара";Производитель;"Цена товара";"Количество на складе";"Ссылка на фотографию (big)";"Ссылка для покупки товара";"Краткое описание";"Полное описание";"Ссылка на фото (small)";Активность;Идентификатор
  2. Real;"Soft";"Германия";45.94;1000;http://www.ez.by/uplo.jpg;http://www.ez.by/sgiant/;"Маленькое описание";"Большое описание";;on;5663060000
  3. Boos;"Aquaglide";;15.10;1000;http://www.ez.by/f444160a444c9ef.jpg;http://www.exz.by/0-ml/;"Маленькое описание";"Большое описание";;on;6171050000


Необходимо что бы в записанном файле после идентификатора присутствовал символ разделителя ;
(Добавление)
Предыдущий вопрос решил с помощью array_push
 
 Top
skruglikov
Отправлено: 25 Января, 2017 - 12:40:23
Post Id



Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Янв. 2017  
Откуда: Киев, Украина


Помог: 1 раз(а)




Evgeniii пишет:
Файл читается и записывается, но в конце каждой строки после идентификатора нет разделителя, как мне его добавить при записи?


вам необходимо открыть файл fopen, с помощью цикла пробежать по строкам, причем строка вы возвращаете в переменную И добавляете ваш разделитель ";", выглядит примерно так:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.  
  3.         $handle = @fopen("input.csv", "r");
  4.         $output = @fopen("output.csv", "a");
  5.  
  6.         if ($handle) {
  7.                 while (($buffer = fgets($handle, 4096)) !== false) {
  8.                         $string = $buffer . ";\r";
  9.                         fwrite($output, $string);
  10.                 }
  11.         }
  12.  
  13.  


но вообще ничего в конец добавлять не нужно... вам в основном коде нужно найти строку, где происходит обработка Идентификатора и проверить там переменные! ведь у вас в массиве $data все данные есть, ну на сколько я понял...

(Отредактировано автором: 25 Января, 2017 - 12:41:00)

 
 Top
Evgeniii
Отправлено: 25 Января, 2017 - 21:37:03
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Янв. 2017  


Помог: 0 раз(а)




skruglikov пишет:
ведь у вас в массиве $data все данные есть, ну на сколько я понял...

Все верно, в массиве данные есть, почему-то неверно опознается конец строки.
Читается файл вот этой функцией, возможно в ней где-то ошибка сидит


PHP:
скопировать код в буфер обмена
  1.         function fgetcsv($f, $length, $d=",", $q='"') {
  2.                 $list = array();
  3.                 $st = fgets($f, $length);
  4.                 if ($st === false || $st === null) return $st;
  5.                 while ($st !== "" && $st !== false) {
  6.                         if ($st[0] !== $q) {
  7.                                 # Non-quoted.
  8.                                 list ($field) = explode($d, $st, 2);
  9.                                 $st = substr($st, strlen($field)+strlen($d));
  10.                         } else {
  11.                                 # Quoted field.
  12.                                 $st = substr($st, 1);
  13.                                 $field = "";
  14.                                 while (1) {
  15.                                         # Find until finishing quote (EXCLUDING) or eol (including)
  16.                                         preg_match("/^((?:[^$q]+|$q$q)*)/sx", $st, $p);
  17.                                         $part = $p[1];
  18.                                         $partlen = strlen($part);
  19.                                         $st = substr($st, strlen($p[0]));
  20.                                         $field .= str_replace($q.$q, $q, $part);
  21.                                         if (strlen($st) && $st[0] === $q) {
  22.                                                 # Found finishing quote.
  23.                                                 list ($dummy) = explode($d, $st, 2);
  24.                                                 $st = substr($st, strlen($dummy)+strlen($d));
  25.                                                 break;
  26.                                         } else {
  27.                                                 # No finishing quote - newline.
  28.                                                 $st = fgets($f, $length);
  29.                                         }
  30.                                 }
  31.  
  32.                         }
  33.                         $list[] = $field;
  34.                 }
  35.                 return $list;
  36.         }

(Добавление)
Ошибка именно в этой функции где-то
 
 Top
skruglikov
Отправлено: 26 Января, 2017 - 23:18:54
Post Id



Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Янв. 2017  
Откуда: Киев, Украина


Помог: 1 раз(а)




Evgeniii пишет:
Ошибка именно в этой функции где-то


функция работает правильно даже с вашими данными csv-файла!

можете протестировать код ниже, только укажите ваш файл...
PHP:
скопировать код в буфер обмена
  1.  
  2.         $handle = @fopen("example.csv", "r");
  3.  
  4.         if ($handle) {
  5.                 while (($buffer = _fgetcsv($handle, 1000, ";", "\"" )) !== false) {
  6.                         echo "<pre>";
  7.                         print_r($buffer);
  8.                         echo "</pre>";
  9.                 }
  10.         }
  11.  
  12.     function _fgetcsv($f, $length, $d=",", $q='"') {
  13.             $list = array();
  14.             $st = fgets($f, $length);
  15.             if ($st === false || $st === null) return $st;
  16.             while ($st !== "" && $st !== false) {
  17.                     if ($st[0] !== $q) {
  18.                             # Non-quoted.
  19.                            list ($field) = explode($d, $st, 2);
  20.                             $st = substr($st, strlen($field)+strlen($d));
  21.                     } else {
  22.                             # Quoted field.
  23.                            $st = substr($st, 1);
  24.                             $field = "";
  25.                             while (1) {
  26.                                     # Find until finishing quote (EXCLUDING) or eol (including)
  27.                                    preg_match("/^((?:[^$q]+|$q$q)*)/sx", $st, $p);
  28.                                     $part = $p[1];
  29.                                     $partlen = strlen($part);
  30.                                     $st = substr($st, strlen($p[0]));
  31.                                     $field .= str_replace($q.$q, $q, $part);
  32.                                     if (strlen($st) && $st[0] === $q) {
  33.                                             # Found finishing quote.
  34.                                            list ($dummy) = explode($d, $st, 2);
  35.                                             $st = substr($st, strlen($dummy)+strlen($d));
  36.                                             break;
  37.                                     } else {
  38.                                             # No finishing quote - newline.
  39.                                            $st = fgets($f, $length);
  40.                                     }
  41.                             }
  42.  
  43.                     }
  44.                     $list[] = $field;
  45.             }
  46.             return $list;
  47.     }
  48.  

Прикреплено изображение (Нажмите для увеличения)
Снимок экрана 2017-01-26 в 23.14.56.png
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB