PHP.SU

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

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

> Найдено сообщений: 6
Evgeniii Отправлено: 25 Января, 2017 - 21:37:03 • Тема: Игнорируется последнее поле при разборе CSV файла • Форум: Вопросы новичков

Ответов: 10
Просмотров: 706
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.         }

(Добавление)
Ошибка именно в этой функции где-то
Evgeniii Отправлено: 25 Января, 2017 - 11:01:36 • Тема: Игнорируется последнее поле при разборе CSV файла • Форум: Вопросы новичков

Ответов: 10
Просмотров: 706
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
Evgeniii Отправлено: 23 Января, 2017 - 19:13:56 • Тема: Игнорируется последнее поле при разборе CSV файла • Форум: Вопросы новичков

Ответов: 10
Просмотров: 706
Сломал всю голову уже...
Написал небольшой скрипт
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 в файл записывается только дынные из последней строки, а именно
Почему так?
Evgeniii Отправлено: 23 Января, 2017 - 17:05:00 • Тема: Игнорируется последнее поле при разборе CSV файла • Форум: Вопросы новичков

Ответов: 10
Просмотров: 706
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 )
Evgeniii Отправлено: 23 Января, 2017 - 12:02:01 • Тема: Игнорируется последнее поле при разборе CSV файла • Форум: Вопросы новичков

Ответов: 10
Просмотров: 706
Привести в порядок csv файл не могу, т.к он скачивается с сервера поставщика.
Возможно ли как-то в конце каждой строки добавлять ; и далее уже обрабатывать измененный файл?
Evgeniii Отправлено: 23 Января, 2017 - 00:56:54 • Тема: Игнорируется последнее поле при разборе CSV файла • Форум: Вопросы новичков

Ответов: 10
Просмотров: 706
Есть скрипт, который разбирает из 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.         }

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB