Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильно бработать CSV файл, проблема с разделителем 
V
    Опции темы
Rusman
Дата 25.6.2010, 07:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.5.2006
Где: Пермь

Репутация: нет
Всего: нет



Здравствуйте!
Делаю обработку файла CSV, данные заношу в БД.

Код

$fd = fopen($sh['inn'].".csv", "r");

while (($arr = fgetcsv($fd, 1024, ";")) !== FALSE) {
//здесь скрипт занесения а базу $arr[0],$arr[1] и т.д.
}
fclose($fd);


проблема в следующем. Если встретиться в переменной разделитель(;) то получается не правильно обработается.
Как решить этот вопрос?
PM MAIL ICQ Skype   Вверх
skyboy
Дата 25.6.2010, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



приведи пример. а то пока можно только догадываться, что, наверное, ты имеешь в виду ситуацию, когда символ-разделитель встречается внутри отдельного поля и не должен обрабатываться как разделитель(если это так, то все равно приведи пример, потому что неясно - по каким признакам - кавычки вокруг, минимальная длина поля, прочее - ты, как человек, отличаешь разделитель от "не-разделителя")
PM MAIL   Вверх
Rusman
Дата 25.6.2010, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.5.2006
Где: Пермь

Репутация: нет
Всего: нет



Структура: Артикул;Название;Описание;Цена
Пример csv файла:

`ART J09567`;`Детский электромобиль-квадроцикл Tornado II. TCV-636`;`<span style="color:grey;">Очень красивый, многофункциональный квадроцикл. Несколько скоростей, зеркала заднего вида, закрытый низ корпуса.</span>Характеристики:
предназначен для детей 3-8 лет; `;`15000`

Видите в описании два разва встречается знак ; (точка с запятой)
Скрипт примет ее как разделитель
PM MAIL ICQ Skype   Вверх
ksnk
Дата 25.6.2010, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Rusman, Видите, все поля этой csv строчки взяты в кавычки? 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
MoLeX
Дата 25.6.2010, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



используй вместе с апострофами `;`


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
ksnk
Дата 25.6.2010, 09:09 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата

array fgetcsv ( resource $handle [, int $length [, string $delimiter = ',' [, string $enclosure = '"' [, string $escape = '\\' ]]]] )

обратить внимание на параметр enclosure 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sanchezzz
Дата 25.6.2010, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Код

//Массив в текст в формате CSV
 function array_to_CSV($array){   
        $csv_arr = array(); 
        foreach ($array as $value)   {   
            if(is_array($value))     
            foreach ($value as $item){
             $csv_string .=$item.';' ;    
            }        
         $csv_string.="\n";
        }   
        return $csv_string;   
        }  
    // Текст формата CSV в массив
 function CSVTextToArray($csv_lines = ''){       
        if(is_array($csv_lines)){
        $cnt = count($csv_lines);
        for($i = 0; $i < $cnt; $i++){
          $line = $csv_lines[$i];
          $line = trim($line);      
          $first_char = true;
          $col_num = 0;
          $length = strlen($line);
          for($b = 0; $b < $length; $b++){   
            if($skip_char != true)
            {
              $process = true;
              //      
              if($first_char == true)
              {
                if($line[$b] == '"')
                {
                  $terminator = '";';
                  $process = false;
                }
                else
                  $terminator = ';';
                $first_char = false;
              }
    
              //  ,   
              if($line[$b] == '"'){
                $next_char = $line[$b + 1];
                // 
                if($next_char == '"')
                  $skip_char = true;
                //  
                elseif($next_char == ';')
                {
                  if($terminator == '";')
                  {
                    $first_char = true;
                    $process = false;
                    $skip_char = true;
                  }
                }
              }    
              if($process == true){
                if($line[$b] == ';')
                {
                   if($terminator == ';')
                   {
    
                      $first_char = true;
                      $process = false;
                   }
                }
              }
    
              if($process == true)
                $column .= $line[$b];
    
              if($b == ($length - 1))
              {
                $first_char = true;
              }
    
              if($first_char == true)
              {
    
                $values[$i][$col_num] = $column;
                $column = '';
                $col_num++;
              }
            }
            else
              $skip_char = false;
          }
        }
      }
    
      return $values; 
    } 
    
    
}

Может пригодится )


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Rusman
Дата 25.6.2010, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.5.2006
Где: Пермь

Репутация: нет
Всего: нет



MoLeX
так не получается

Добавлено через 10 минут и 39 секунд
ksnk, спасибо! оказалось все просто )) указать ограничитель поля и все )
PM MAIL ICQ Skype   Вверх
skyboy
Дата 25.6.2010, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



MoLeX, к сожалению,
Цитата(php.net)

 delimiter
 Set the field delimiter (one character only).

хотя в некоторых случаях(к примеру, некорректный с точки зрения оформления CSV, файл, в котором разделителями служит несколько подряд идущих пробелов) хотелось бы использовать fgetcsv вместо preg_split

Добавлено через 1 минуту и 16 секунд
Цитата(Rusman @  25.6.2010,  08:23 Найти цитируемый пост)
оказалось все просто

не ставлю целью обидеть, но ведь описания параметров в мануале приведены практически сразу же. стоило ли ждать на форуме ответа 4 часа вместо того, чтоб 3 минуты почитать мануал?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0803 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.