ФорумПрограммированиеPHP для идиотов → Работа с csv-файлами и Функция fgetcsv...

Работа с csv-файлами и Функция fgetcsv...

  • Николай_П

    Сообщения: 74 Репутация: N Группа: Кто попало

    Spritz 27 ноября 2008 г. 16:55

    Следующий код выводит данные и файла типа *.csv

    <?php
    error_reporting( E_ALL & E_STRICT );
    $f = fopen("file.csv", "rt") or die("Ошибка!");

    for ($i=0; $data=fgetcsv($f,1000,";"); $i++) {
    $num = count($data);
    echo "<h3>Строка номер: $i</h3>";
    for ($j=0; $j<$num; $j++)
    {echo "[$j]: $data[$j]<br>";
    }
    }

    fclose($f);
    ?>


    При этом вывод данных происходит последовательно. У меня, как и любого начинающего, возник резонный вопрос:

    "Можно ли выводить строки в произвольном порядке или по другому как записать в массив $data, к примеру, строку под номером 10, при это не перебирая 9 предыдущих строк?"
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 ноября 2008 г. 16:57, спустя 1 минуту 39 секунд

    <?php
    error_reporting( E_ALL & E_STRICT );
    $f = fopen("file.csv", "rt") or die("Ошибка!");

    for ($i=0; $data=fgetcsv($f,1000,";"); $i++) {
    if($i<9) continue;
    $num = count($data);
    echo "<h3>Строка номер: $i</h3>";
    for ($j=0; $j<$num; $j++)
    {echo "[$j]: $data[$j]<br>";
    }
    }

    fclose($f);
    ?>
    Сапожник без сапог
  • Николай_П

    Сообщения: 74 Репутация: N Группа: Кто попало

    Spritz 27 ноября 2008 г. 17:02, спустя 4 минуты 51 секунду

    Я, конечно Новичок, но если я не ошибаюсь, то в предложенном Вами коде происходит перебор строк с 1по 9. И после этого происходит вывод 10.
    Вопрос я формулировал несколько подругому. Как осуществить это без Перебора? Грубо я задаю $i=10 и программа сразу, еще раз повторюсь без перебора, выдает строку 10!!!
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 27 ноября 2008 г. 17:04, спустя 2 минуты 32 секунды

    Никак.
    Нет такого понятия в файле - строка. Файл - это полседовательность байт, среди которых произвольно встречаются символы перевода строки. Можно лишь переместиться на сколько-то байт.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 ноября 2008 г. 17:05, спустя 1 минуту 2 секунды

    никак. раз вы новичек, вы видимо не знаете, что чтобы отсчитать 10ую строку в файле, необходимо найти 10ый перенос строки - \n символ. мб я не прав? :)
    Сапожник без сапог
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 27 ноября 2008 г. 17:21, спустя 15 минут 52 секунды

    Николай_П, подсосать мускулем ваш csv и выбрать 10 ид ;)
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 ноября 2008 г. 17:26, спустя 4 минуты 51 секунду

    ну и метод ……
    Сапожник без сапог
  • Николай_П

    Сообщения: 74 Репутация: N Группа: Кто попало

    Spritz 27 ноября 2008 г. 17:27, спустя 35 секунд

    Я правильно понимаю, что в такой интерпретации перебор происходит по ячейкам (значения отделенный ";"), а не по переносу строки? Тем самым замедляя процесс выполнения задачи!

    for ($i=0; $data=fgetcsv($f,1000,";"); $i++) {
     if($i<9) continue;



    Мне кажется резонно было бы добавить в эту функцию еще один параметр, например str, чтобы функция приняла следующий вид
    fgetcsv($f,1000,";",str);

    где str номер нужной строки. И выполнялась бы она по следующему принципу: Ищем, в нашем случае 10 знак переноса (\n), и выводим заданную строку!!!
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 ноября 2008 г. 17:28, спустя 1 минуту 23 секунды

    вы неправильно поняли, вы неправильно думаете, вам лучше пока не думать. все что вы предлагаете - бред чистой воды :)
    простите, но это так.

    Сапожник без сапог
  • Николай_П

    Сообщения: 74 Репутация: N Группа: Кто попало

    Spritz 27 ноября 2008 г. 17:29, спустя 1 минуту 19 секунд

    Вроде я зашел в раздел начинающих php программистов,  а не в раздел гламурного изложения непонятного пафоса!
    Жду Ваших решений, Господа!
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 ноября 2008 г. 17:31, спустя 1 минуту 10 секунд

    <?php
    error_reporting( E_ALL & E_STRICT );
    $f = fopen("file.csv", "rt") or die("Ошибка!");

    for ($i=0; $data=fgetcsv($f,1000,";"); $i++) {
    if($i<9) continue;
    $num = count($data);
    echo "<h3>Строка номер: $i</h3>";
    for ($j=0; $j<$num; $j++)
    {echo "[$j]: $data[$j]<br>";
    }
    }

    fclose($f);
    ?>


    у нас нет снисхождения. а решение было предложено во втором посте. или третьем ли
    Сапожник без сапог
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 27 ноября 2008 г. 17:32, спустя 1 минуту 43 секунды

    Мне кажется резонно было бы добавить в эту функцию еще один параметр, например str, чтобы функция приняла следующий вид
    php-код:
    1
    fgetcsv($f,1000,";",str);

    где str номер нужной строки. И выполнялась бы она по следующему принципу: Ищем, в нашем случае 10 знак переноса (\n), и выводим заданную строку!!!


    И чего мы тогда добьемся? =)
    Что мы будем перебирать
    while ($data = fgetcsv($handle,10000, ";")&&$str–>0)
    {
    $row[]=$data;
    }

    и потом выводить $row[10]
    Что этот кусок кода будет в стандартной функции.
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 27 ноября 2008 г. 18:19, спустя 47 минут 1 секунду

    Николай_П, расскажи откуда возникла такая задача, в принципе?
    Часто уши иррациональных запросов, растут из того, что воопрошающий спрашивает вообще не то, что ему требуется на самом деле.
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 27 ноября 2008 г. 18:31, спустя 11 минут 17 секунд

    function bred($file, $number, $separator)
    {
    $file = file($file);
    return explode($separator, $file[$number]);
    }
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 27 ноября 2008 г. 19:42, спустя 1 час 11 минут 42 секунды

    aivee, вас бы в армию
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!