Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Нужна помощь с парсером
 
 автор: 27   (19.03.2007 в 12:03)   письмо автору
3.5 Кб
 
 

Здравствуйте,
У меня не получается адаптировать парсер csv под свой прайс...
как ни пытался ничего не выход. Прошу вашей помощи. У меня уже как всегда "петух клюнул".
прайсов куча и они все по структуре одинаковы. пример прайса в аттаче

   
 
 автор: KPETuH   (19.03.2007 в 12:04)   письмо автору
 
   для: 27   (19.03.2007 в 12:03)
 

так а в чем проблема то?

   
 
 автор: 27   (19.03.2007 в 12:10)   письмо автору
 
   для: KPETuH   (19.03.2007 в 12:04)
 

в прайсе были запятые, я их заменил на пробелы и сохранил как csv c разделителями - запятыми (другого пункта нет). Затем пытаюсь читать файл, он читает криво.
вот код парсера:

<?php 
 
// &#207;&#238;&#235;&#243;&#247;&#224;&#229;&#236; &#239;&#229;&#240;&#229;&#236;&#229;&#237;&#243;&#254; &#234; &#228;&#229;&#233;&#241;&#242;&#226;&#232;&#254;
 
$w $_GET['w'];
 
 
// &#197;&#241;&#235;&#232; &#239;&#229;&#240;&#229;&#236;&#229;&#237;&#237;&#224;&#255; $w &#237;&#229; &#239;&#243;&#241;&#242;&#224;, &#244;&#238;&#240;&#236;&#232;&#240;&#243;&#229;&#236; html &#234;&#238;&#228; &#242;&#224;&#225;&#235;&#232;&#246;&#251;
 
if(($w=='readcsv')) 
  {
   
// &#207;&#240;&#238;&#226;&#229;&#240;&#255;&#229;&#236; &#239;&#238;&#235;&#255; &#244;&#238;&#240;&#236;&#251; &#237;&#224; &#241;&#238;&#238;&#242;&#226;&#229;&#242;&#241;&#226;&#232;&#229;
   
if(empty($_FILES['filename']['tmp_name'])) echo "&#194;&#226;&#229;&#228;&#232;&#242;&#229; &#239;&#243;&#242;&#252; &#234; &#244;&#224;&#233;&#235;&#243;";
   
// &#206;&#242;&#234;&#240;&#251;&#226;&#224;&#229;&#236; &#239;&#229;&#240;&#229;&#228;&#224;&#237;&#237;&#251;&#233; &#244;&#224;&#233;&#235;
   
if(!($fp fopen($_FILES['filename']['tmp_name'],"rb")))
    {
     echo 
"<p>&#205;&#229;&#226;&#238;&#231;&#236;&#238;&#230;&#237;&#238; &#238;&#242;&#234;&#240;&#251;&#242;&#252; &#244;&#224;&#233;&#235;.</p>";
     exit();
    } 
   
// &#215;&#232;&#242;&#224;&#229;&#236; &#241;&#238;&#228;&#229;&#240;&#230;&#232;&#236;&#238;&#229; &#244;&#224;&#233;&#235;&#224; &#226; &#239;&#240;&#238;&#236;&#229;&#230;&#243;&#242;&#238;&#247;&#237;&#251;&#233; &#225;&#243;&#244;&#229;&#240; - $buffer
   
$buffer fread($fp,filesize($_FILES['filename']['tmp_name']));
   
   
// &#199;&#224;&#234;&#240;&#251;&#226;&#224;&#229;&#236; &#244;&#224;&#233;&#235;
   
fclose($fp);
   
   
// &#197;&#241;&#235;&#232; &#232;&#236;&#229;&#254;&#242;&#241;&#255; &#239;&#243;&#241;&#242;&#251;&#229; &#239;&#238;&#231;&#232;&#246;&#232;&#232;, &#231;&#224;&#236;&#229;&#237;&#255;&#229;&#236; &#232;&#245; &#239;&#240;&#238;&#247;&#229;&#240;&#234;&#238;&#236; 
   
$buffer str_replace($_POST['separator'].$_POST['separator'], $_POST['separator']."-".$_POST['separator'],$buffer);
   
$buffer str_replace("\n".$_POST['separator'],"\n-".$_POST['separator'], $buffer);
   
   
// &#199;&#224;&#236;&#229;&#237;&#255;&#229;&#236; &#239;&#240;&#255;&#236;&#251;&#229; &#234;&#224;&#226;&#251;&#247;&#234;&#232; &#238;&#225;&#240;&#224;&#242;&#237;&#251;&#236;&#232;
   
$buffer str_replace("'""`",$buffer);
   
   
// &#208;&#224;&#231;&#225;&#232;&#226;&#224;&#229;&#236; &#244;&#224;&#233;&#235; &#239;&#238; &#241;&#242;&#240;&#238;&#234;&#224;&#236;, &#234;&#224;&#230;&#228;&#243;&#254; &#241;&#242;&#240;&#238;&#234;&#243; &#244;&#224;&#233;&#235;&#224; &#239;&#238;&#236;&#229;&#249;&#224;&#229;&#236; &#226; &#238;&#242;&#228;&#229;&#235;&#252;&#237;&#251;&#233;
   // &#253;&#235;&#229;&#236;&#229;&#237;&#242; &#239;&#240;&#238;&#236;&#229;&#230;&#243;&#242;&#238;&#247;&#237;&#238;&#227;&#238; &#236;&#224;&#241;&#241;&#232;&#226;&#224; $strtmp
   
$tok strtok($buffer,"\n");
   
$strtmp[] = $tok;
   while (
$tok)
    {
     
$tok strtok("\n");
     
$strtmp[] = $tok;
    }
   
   
// &#205;&#224;&#247;&#232;&#237;&#224;&#229;&#236; &#244;&#238;&#240;&#236;&#232;&#240;&#238;&#226;&#224;&#237;&#232;&#229; &#242;&#224;&#225;&#235;&#232;&#246;&#251;
   
   // &#208;&#224;&#231;&#225;&#232;&#226;&#224;&#229;&#236; &#241;&#242;&#240;&#238;&#234;&#243; &#239;&#238; &#238;&#242;&#228;&#229;&#235;&#252;&#237;&#251;&#236; &#241;&#235;&#238;&#226;&#224;&#236;, &#232;&#241;&#239;&#238;&#235;&#252;&#231;&#243;&#255;
   // &#240;&#224;&#231;&#228;&#229;&#235;&#232;&#242;&#229;&#235;&#252; $_POST['separator']
   
foreach($strtmp as $value)
    {
     
// &#197;&#241;&#235;&#232; &#241;&#242;&#240;&#238;&#234;&#224; &#239;&#243;&#241;&#242;&#224;&#255; &#226;&#251;&#245;&#238;&#228;&#232;&#236; &#232;&#231; &#246;&#232;&#234;&#235;&#224;
     
if(trim($value)=="") break;

     
// &#205;&#224;&#247;&#232;&#237;&#224;&#229;&#236; &#244;&#238;&#240;&#236;&#232;&#240;&#238;&#226;&#224;&#237;&#232;&#229; &#241;&#242;&#240;&#238;&#234;&#232; &#242;&#224;&#225;&#235;&#232;&#246;&#251;
     
$strtmp strtok($value$_POST['separator']);
     while(
$strtmp strtok($_POST['separator']))
      {
       
$strtmp explode($_POST['separator'],$strtmp);
       
$name $strtmp[0];
       
$price $strtmp[1];
       
$phone $strtmp[2];
       
$company $strtmp[3];
       echo 
$name." &nbsp; &nbsp; ".$price." &nbsp; &nbsp; ".$phone." &nbsp; &nbsp; ".$company." <br> <br> ";
      }
  }
  echo 
"OK";
  }
 else {
  echo 
"<form enctype='multipart/form-data' action='csv.php?w=readcsv' method='post'>
         <table>
          <tr>
           <td>
            &#244;&#224;&#233;&#235;
           </td>
           <td>
            <input size='61' type='file' name='filename'>
           </td>
          </tr>
          <tr>
          <td>
           &#240;&#224;&#231;&#228;&#229;&#235;&#232;&#242;&#229;&#235;&#252;
          </td>
          <td>
           <input size='1' type='text' name='separator' value=';'>
          </td>
         </tr>
         <tr>
          <td>
          </td>
          <td>
           <input type='submit' value='&#200;&#236;&#239;&#238;&#240;&#242;&#232;&#240;&#238;&#226;&#224;&#242;&#252;'>
          </td>
         </tr>
        </table>
       </form>"
;
 }
?>

   
 
 автор: Trianon   (19.03.2007 в 12:33)   письмо автору
 
   для: 27   (19.03.2007 в 12:03)
 

пользуйтесь функцией fgetcsv() - не изобретайте велосипед...

   
 
 автор: KPETuH   (19.03.2007 в 12:37)   письмо автору
 
   для: 27   (19.03.2007 в 12:03)
 

Вот этот код у меня прекрасно работает:

<?php  
$w 
$_GET['w']; 
if((
$w=='readcsv'))  
  { 
   if(empty(
$_FILES['filename']['tmp_name'])) echo "Типа файла несуществует"
   
$fp=file($_FILES['filename']['tmp_name']);
   foreach (
$fp as $str)
   {
       
$mass=explode($_POST['separator'],trim($str));
       echo 
$mass[0]." ".$mass[1]." ".$mass[2]." ".$mass[3]."<br>";
   }  
  echo 
"OK"
  } 
 else { 
  echo 
"<form enctype='multipart/form-data' action='?w=readcsv' method='post'> 
         <table> 
          <tr> 
           <td> 
            Файл 
           </td> 
           <td> 
            <input size='61' type='file' name='filename'> 
           </td> 
          </tr> 
          <tr> 
          <td> 
           Разделитель
          </td> 
          <td> 
           <input size='1' type='text' name='separator' value=';'> 
          </td> 
         </tr> 
         <tr> 
          <td> 
          </td> 
          <td> 
           <input type='submit' value='Нажми меня'> 
          </td> 
         </tr> 
        </table> 
       </form>"

 } 
?>

   
 
 автор: 27   (19.03.2007 в 15:08)   письмо автору
 
   для: KPETuH   (19.03.2007 в 12:37)
 

Очень благодарен, вылечило!

   
 
 автор: Trianon   (19.03.2007 в 15:22)   письмо автору
 
   для: 27   (19.03.2007 в 15:08)
 

такой подход вылечит ненадолго.
Первая же точка с запятой среди данных, либо поле, где встречаются кавычки, и этот скрипт сядет в лужу.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования