За последние 24 часа нас посетили 17946 программистов и 1280 роботов. Сейчас ищут 1574 программиста ...

Построчная обработка .csv с запоминанием строки

Тема в разделе "PHP для новичков", создана пользователем starryknight, 26 мар 2017.

Метки:
  1. starryknight

    starryknight Новичок

    С нами с:
    19 ноя 2016
    Сообщения:
    8
    Симпатии:
    0
    Друзья, задача такая. Есть csv вида: "текст", "картинка" длиной 1000+ срок. Раз в день (настрою крон) скрипт должен обработать первые 5 строк (добавить к каждой строке время и отправить по почте). Вижу 2 варианта:
    1. брать по одной строке с 1 по 5, обрабатывать, удалять со сдвигом
    2. брать 5 строк, обрабатывать, записывать номер последней обработанной строки в файл, а на следующий день начинать обработку с записанной строки
    В этой теме Чтение и удаление одной строки из файла YSandro предложил решение по второму варианту, которое прекрасно работает с txt (запоминает позицию). Да вот только я никак не соображу, как его адаптировать под csv, чтобы запоминалась строка.

    Одним словом, я пытаюсь вот этот свой код совместить с указанным выше решением, но без успеха. Надеюсь на помощь сообщества.
    PHP:
    1. $row = 1;              
    2. $handle = fopen("test.csv", "r");
    3.     for ($i = strtotime('08:00'); $data = fgetcsv($handle ); ++$i) {      
    4.         $text = $data[0];                  
    5.         $image = $data[1];
    6.                         //Здесь делаю, что нужно
    7.                         echo "<p> Номер строки: $row: \n";
    8.                         echo "Первый столбик: $text ";
    9.                         echo "Второй столбик: $image ";
    10.                         echo date("F j, Y, g:i a",$i).'</br>';
    11.                      
    12.         $i =  $i + 3600*3;
    13.     $row++;
    14.     }
    15. fclose($handle);    
     
  2. starryknight

    starryknight Новичок

    С нами с:
    19 ноя 2016
    Сообщения:
    8
    Симпатии:
    0
    Все вроде неплохо, строку записывает, но тем не менее начинает с начала, с первой
    PHP:
    1. $handlePos = @fopen('pos.txt', 'r+');//открываем файл с последним положением
    2.     if($handlePos){
    3.         if (($buffer = fgets($handlePos, 10)) !== false) {
    4.             $startPos=(int)$buffer;
    5.             if($startPos<0) $startPos=0;                  
    6.                         $row = 1;              
    7.                         $handle = fopen("test.csv", "rb");
    8.                             $buffer='';
    9.                             $newPos=$startPos;    
    10.                             for ($i = strtotime('08:00'); $buffer = fgetcsv($handle ); ++$i) {
    11.                                 if ($row <6){
    12.                                     $text = $buffer[0];                  
    13.                                     $image = $buffer[1];
    14.                                                     //Здесь делаю, что нужно
    15.                                                     echo "<p> Номер строки: $row: \n";
    16.                                                     echo "Первый столбик: $text ";
    17.                                                     echo "Второй столбик: $image ";
    18.                                                     echo date("F j, Y, g:i a",$i).'</br>';
    19.                                                    
    20.                                     $i =  $i + 3600*3;
    21.                                 $row++;
    22.                                 $newPos=$row;//запишем номер последней обработанной строки
    23.                                 }
    24.                             }
    25.                         fclose($handle);  
    26.                 if($newPos!=$startPos){
    27.                 rewind($handlePos);
    28.                 fwrite($handlePos, $newPos);//записываем позицию, на которой остановились
    29.                 }
    30.     fclose($handlePos);
    31.         }
    32.     }else{
    33.         echo 'что-то с файлом pos.txt';
    34.     }