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

Форум PHP

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

 

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

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

тема: CSV и точка с запятой
 
 автор: krollik   (07.04.2006 в 15:40)   письмо автору
 
 

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

   
 
 автор: Loki   (07.04.2006 в 15:42)   письмо автору
 
   для: krollik   (07.04.2006 в 15:40)
 

может экранируют?

   
 
 автор: Trianon   (07.04.2006 в 15:47)   письмо автору
 
   для: Loki   (07.04.2006 в 15:42)
 

в CSV не применяется экранирование.
Разве только вот кавычки, встречающиеся в тексте - удваивают, чтобы отличить от кавычки -ограничителя текстового поля.

   
 
 автор: elenaki   (07.04.2006 в 15:52)   письмо автору
 
   для: Loki   (07.04.2006 в 15:42)
 

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

экранировать - это хорошо. но это надо делать ДО создания scv, еще в Экселе. сделать
замену всех ; на ... что? я-то меняла на ?, хоть это и неправильно грамматически. а в
русском на что менять? на точку? HO ведь даже, если мы поставим впереди ; какой-то символ,
сам знак-то останется и будет выглядеть так же как и разделители полей. можно поля
разделять другим символом - табом, например. а в PHP строки разбивать по \t

   
 
 автор: Trianon   (07.04.2006 в 15:45)   письмо автору
 
   для: krollik   (07.04.2006 в 15:40)
 

; которые стоят в тексте заключены в кавычки вместе с текстом. А разделяющие - нет.

   
 
 автор: krollik   (07.04.2006 в 16:06)   письмо автору
 
   для: Trianon   (07.04.2006 в 15:45)
 

а как их различать?
Если можно то напишите код, чтобы он разюивал строку на переменные и засовывал всё в массив

   
 
 автор: elenaki   (07.04.2006 в 16:11)   письмо автору
 
   для: krollik   (07.04.2006 в 16:06)
 

filename = "hotels.txt"; 
  // otkrivaem
  $file = fopen($filename, "r"); 
  // chitaem
  $buffer = fread($file, filesize($filename)); 
  // zakrivaem
  fclose($file); 
  
// delaem massiv iz stroki dannix
$file_array = explode("\n", $buffer);
//nachalo perebora massiva
foreach ($file_array as $line_num => $line) {
$line_exp = explode(";", $line);

$sqlquery = 'INSERT INTO hotels VALUES ('; 
    $sqlquery .= '""';  // id
    $sqlquery .= ',"'.addslashes($line_exp[5]) . '"';  //hotel name
    $sqlquery .= ',"'.$line_exp[8] . '"';  // class
    $sqlquery .= ',"'.addslashes($line_exp[15]) . '"';  // adress
    $sqlquery .= ',"'.$line_exp[13]. '"';   //area
    $sqlquery .= ',"'.$line_exp[11]. '"';   //perif
    $sqlquery .= ',"'.$line_exp[10]. '"';   //nomos
    $sqlquery .= ',"'.$line_exp[17]. '"';   //tel
    $sqlquery .= ',"'.$line_exp[18]. '"';  //fax
    $sqlquery .= ',"'.$line_exp[2]. '"';  //email
    $sqlquery .= ',"'.$line_exp[21]. '"'; //rooms
    $sqlquery .= ',"'.$line_exp[22]. '"';  //beds
    
    
    $sqlquery .= ')';
    //echo $sqlquery.";<br>";   /// echo - for test
    $result = mysql_query($sqlquery) or die(" $sqlquery <b>failed!</b><br>".mysql_error());
 }    

   
 
 автор: krollik   (07.04.2006 в 16:14)   письмо автору
 
   для: elenaki   (07.04.2006 в 16:11)
 

э.. так а где тут проверка на лишнии точки с запятыми?

   
 
 автор: elenaki   (07.04.2006 в 16:16)   письмо автору
 
   для: krollik   (07.04.2006 в 16:14)
 

дык, а я и не сказала, что я решила... я у себя меняла ; внутри текста на ?

   
 
 автор: krollik   (07.04.2006 в 16:19)   письмо автору
 
   для: elenaki   (07.04.2006 в 16:16)
 

=) не мне такое не потходит..

   
 
 автор: elenaki   (07.04.2006 в 16:33)   письмо автору
 
   для: krollik   (07.04.2006 в 16:19)
 

а создать scv с другим разделителем полей? не точка с запятой, а tab.

   
 
 автор: krollik   (07.04.2006 в 16:52)   письмо автору
 
   для: elenaki   (07.04.2006 в 16:33)
 

это заказчику надо =)) а у него такой вот CSV..

   
 
 автор: Trianon   (07.04.2006 в 20:39)   письмо автору
 
   для: krollik   (07.04.2006 в 16:52)
 

Вот. Найдете баги - пишите.
<?php
// --------------------------------------------------------------------------
// программа импорта CSV файла в массив PHP
// Автор: Томашпольский Д.Ф.  (aka Trianon)
// e-mail: toddy at mail dot ru
// Версия: 1 (2006-04-07)
// --------------------------------------------------------------------------
   
$csv '';
   if(isset(
$_FILES['csv']) && $_FILES['csv']['name'] != ''// если задан файл
       
$csv $_FILES['csv']['tmp_name'];
// пример применения
   
if($csv != '')
   {
       
$list= array();
       
$f fopen($csv'r'); // открываем загруженный файл,

       
while(!feof($f))   // читаем строки
         
if(($line fgets($f)) != '')  // обход пустой строки в конце файла
           
$list[] = csv_convert_line($line); // формируем двумерный массив полей
       
echo "<pre>";
       
print_r($list);   // печатаем то, что получилось.
       
echo "</pre>";
   }
//-----------------------------------------------------------------------------
// $array_of_fields = csv_convert_line($line);
//-----------------------------------------------------------------------------
// преобразует строку CSV-файла  в массив полей
// по умолчанию считается, что поля разделены  символами ';'
// и  при необходимости заключены в ограничители '"',
// но их можно указать явно во втором и третьем параметре.
// подряд удвоенный ограничитель означает соответствующий символ в сторке.
//-----------------------------------------------------------------------------
function csv_convert_line($line$sep ';'$quo '"')
{
    
$line rtrim($line"\r\n");
//    если версия PHP  < 4.1
//    while(($last = substr($line, -1,1)) == '\n' || $last == '\r')
//        $line = substr($line, 0, -1);
    
$row = array();
    
$pos 0;
    
$len strlen($line);
    
$in_quotes 0;
    
$field ''// строка пока пуста

    
for(;;)
    {
        
$qix strpos($line$quo$pos);  // ищем кавычку
        
if($qix === false$qix $len;

        if(!
$in_quotes)
        {
            if(
$qix $len && $qix == $pos// тут же встретилась кавычка
            
{
                 
$in_quotes 1// значит это открывающая кавычка
                 
++$pos;        // пропустим
            
}
            else
            {
                
$six strpos($line$sep$pos); // поищем запятую
                
if($six === false$six $len;

                if(
$six $pos)   // добавим остаток стороки, если не пусто
                   
$field .=  substr($line$pos$six-$pos);
                
$row[] = $field;  // формируем еще одно поле
                
$pos $six;
                if(
$pos >= $len)
                    break;
                
$field '';
                ++
$pos// пропустим запятую и проверим очередную колонку
            
}
        }
        else
        {
            if(
$qix $pos)
                
$field .= substr($line$pos$qix-$pos); // добавим кусочек
            
$pos $qix;
            if(
$pos >=  $len)
                break;

            ++
$pos//   нашли кавычку
            
if($pos $len && $line[$pos] == $quo// это удвоенная кавычка
            
{
                
$field .= '"'// учтем в поле
                
++$pos;
                    if(
$pos >= $len)  // если строка кончилась, значит закрывающей
                        
$in_quotes=0// кавычки мы не дождемся.
            
}
            else 
// значит мы добрались до закрывающей кавычки
                 
$in_quotes 0;
        }
    }
    return 
$row;
}



?>

  <form method=post enctype="multipart/form-data" >
  csv convertor <input type=file name=csv  />
<br><input type=submit />  </form>

   
 
 автор: krollik   (07.04.2006 в 20:44)   письмо автору
 
   для: Trianon   (07.04.2006 в 20:39)
 

счас заценю =))

   
 
 автор: Trianon   (07.04.2006 в 20:44)   письмо автору
 
   для: Trianon   (07.04.2006 в 20:39)
 

Cheops! Как насчет варианта того же самого на базе preg_match?
Только чур с Фридла не списывать :))

   
 
 автор: cheops   (07.04.2006 в 23:38)   письмо автору
 
   для: Trianon   (07.04.2006 в 20:44)
 

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

PS Во Фридла лишний раз лазить не следует - черезвычайно занудное чтение :)))

   
 
 автор: cheops   (07.04.2006 в 23:36)   письмо автору
 
   для: krollik   (07.04.2006 в 15:40)
 

А вы посмотрите в скрите http://www.softtime.ru/info/csv.php, как там решается эта проблема.

   
Rambler's Top100
вверх

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