Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/35: Рейтинг темы: голосов - 35, средняя оценка - 4.63
3 / 3 / 0
Регистрация: 26.07.2012
Сообщений: 122

Построчное чтение файл csv

09.07.2018, 06:51. Показов 6768. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Направьте в правильную сторону.

Есть файл весом в 400мб формат csv нужно построчно брать данные обрабатывать, и переходить к следующей строке.
Загвоздка в том что на хостинге ограничение по времени выполнения скрипта. И есть желание сделать счетчик какая строка обработалась и при следующем запуске начать работу с того места где закончил.

Использую тестовый файл на 315 строк, и такую конструкцию
PHP
1
2
3
4
5
6
7
8
9
10
11
    
$file = fopen('test.csv', 'r');
$n = 0;
while(!feof($file)){
    $n++;
    $stmt = $dbh->prepare("UPDATE csv SET `line`=:n WHERE id = 1");
    $sqldata = [':n'=>$n];
    $stmt->execute($sqldata);
    $csv_st = fgetcsv($file, '"', ';');
}
    fclose($file);
При таком раскладе проходит все 315 строк за 5 секунд.
Но если меняю конструкцию. На
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
    
$file = fopen('test.csv', 'r');
$n = 0;
while(!feof($file)){
$n++;
 if(n<100){
     $stmt = $dbh->prepare("UPDATE csv SET `line`=:n WHERE id = 1");
     $sqldata = [':n'=>$n];
     $stmt->execute($sqldata);
     $csv_st = fgetcsv($file, '"', ';');
 }
}
fclose($file);
То в теории должно выполнится только первые 100 строк, остальное отпасть.
В базе видно что выполнились только первые 100 строк, но цикл while крутится пока не закончится время на выполнения php скрипта, такое впечатление что добавления условия if просто заставляет цикл крутится вечно.
Как это отследить и проверить в чем причина не пойму.

Пытался другие методы, как прочитать файл в массив через file но тогда файл делится на массик в одной ячейки одна строка, проблема в том что в csv в ячейке может быть перенос строки, и file это не учитывает и массив в стиле csv уже не собрать.

Где я глуплю, что мне читать ?
Заранние спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.07.2018, 06:51
Ответы с готовыми решениями:

Построчное чтение из .txt
Добрый день. Скажите, а можно ли построчно читать .txt файл и присваивать каждой переменной отдельное значение? К примеру, у меня есть...

Масивы и построчное чтение
В общем суть такова: я парсю файл foareach'ем $file = file('data.bin'); foreach ($file as $key =&gt; $string){ } внутри каждого...

Построчное чтение файла+explode()
Здравствуйте. Есть файл где хранятся имена и фамилии. Файл: Name1 LastName1 Name2 LastName2 Name3 LastName3 ... ... ...

6
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
09.07.2018, 11:22
Цитата Сообщение от Rassol2 Посмотреть сообщение
if(n<100){
...

И переделать на цикл for, сделав нормальное условие остановки при достижении 100 строк
0
3 / 3 / 0
Регистрация: 26.07.2012
Сообщений: 122
09.07.2018, 20:29  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
И переделать на цикл for, сделав нормальное условие остановки при достижении 100 строк
Переделал на for но главная задача зафиксировать когда отключится работа скрипта по тайм лимиту, и следующий запуск сделать с места где скрипт закончил.

так вот если сделать цикл for где мы получить первые 100 значений все работает.
PHP
1
2
3
4
5
6
7
        for($n=1;$n<100;$n++){
            $stmt = $dbh->prepare("UPDATE csv SET `line`=:n WHERE id = 1");
            $sqldata = [':n'=>$n];
            $stmt->execute($sqldata);
            $csv_st = fgetcsv($file, '"', ';');
            wtfarrey($csv_st);
}
А вот что бы получить все значения выше сотой уже ни одна итерация не проходит, чего я не понимаю про циклы ?
PHP
1
2
3
4
5
6
7
        for($n=1;$n>100;$n++){
            $stmt = $dbh->prepare("UPDATE csv SET `line`=:n WHERE id = 1");
            $sqldata = [':n'=>$n];
            $stmt->execute($sqldata);
            $csv_st = fgetcsv($file, '"', ';');
            wtfarrey($csv_st);
}
0
 Аватар для koders
259 / 193 / 50
Регистрация: 15.07.2016
Сообщений: 649
09.07.2018, 22:23
Как вариант, записывать куда-нибудь (хотя бы в файл) № обрабатываемой строки. А сам скрипт добавить в крон, где и проверять, насколько давно файл изменён.
Альтернативный вариант — обрабатывать заведомо небольшую (чтобы хватало времени) группу значений, после чего дёрнуть этот же скрипт по HTTP, передав в параметрах № строки. Вариант не особо хороший, но вполне рабочий.

Цитата Сообщение от Rassol2 Посмотреть сообщение
чего я не понимаю про циклы ?
PHP
1
for (начальное значение; условие; приращение)
Условие ложно — цикл прекращается.
Для корректной работы нужно сначала пропустить обработанные ранее строки. Быстрее всего это сделать с помощью позиционирования — см. команды ftell/fseek. В самом запущенном случае, можно сделать «в лоб»:
PHP
1
2
3
for($n=1;$n<100;$n++){
    fgetcsv($file, '"', ';');
}
А далее уже продолжить с сотни.
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
09.07.2018, 22:58
Rassol2, должно быть 2 условия останова цикла: достигнут конец файла или прочитано 100 строк. И при последующих чтениях файла нужно помнить, что чтение начинать нужно не с начала. Поэтому запоминать лучше не сколько строк, а сколько байт прочитано и предварительно перематывать файл (fseek и ftell)
1
87 / 48 / 24
Регистрация: 29.11.2016
Сообщений: 243
09.07.2018, 23:04
PHP
1
2
3
4
5
6
7
8
9
10
11
12
$file = fopen('test.csv', 'r');
$n = 0;
while(!feof($file)){
$n++;
 if(n<100){
     $stmt = $dbh->prepare("UPDATE csv SET `line`=:n WHERE id = 1");
     $sqldata = [':n'=>$n];
     $stmt->execute($sqldata);
     $csv_st = fgetcsv($file, '"', ';');
 }
}
fclose($file);
А здесь сотня прошла но конца файла ещё нет.
Идет дальше прогон строк без обработки.
Или timeout или конец файла.

Добавлено через 4 минуты
Ссылка не идет. Текст
Кликните здесь для просмотра всего текста
Для запуска скрипта на сервере с условно-бесконечным или просто большим временем выполнения надо так или иначе запускать его как консольный скрипт. Сервер - программа, которая не предназначена для того, чтобы один из ее воркеров выпла на условное навсегда, если парсер запускается в рамках обычного веб-запроса, то сервер вынужден делегировать один из своих потоков этому парсера, и ждать, когда он отработает (никогда). Если страница тридцать секунд не может вернуть ответ, значит, стоит вернуть ошибку ожидания пользователю. Вопрос не говорит о методе запуска скрипта, поэтому я на всякий уточнил.

Как запустить скрипт из консоли? Очень просто: подключиться к терминалу сервера и выполнить этот скрипт с помощью php: php script.php. В этом случае:

Не убивается воркер веб-сервера и вообще не участвует внешняя оболочка скрипта
По умолчанию max execution time неограничено
Не нужно форматировать вывод как html, плюс можно логировать вывод средствами самой ОС.

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

Как регулярно запускать скрипт? Как ответили выше - по крону (планировщику заданий). 99%, что на сервере установлен linux, а значит планировщиком является cron. Подробную документацию вы найдете в интернете, задания редактируются с помощью crontab -e или в панели хостера и представляют из себя время выполнения и команду, которую необходимо исполнить - точно такую же, как в примере выше. Таким образом cron поможет запускать скрипт каждые N минут или гарантировать его перезапуск в случае падения.

Как убедиться, что скрипт отработал перед тем, как запускать его снова? Вот тут начинает прорастать филигранная работа. Проще всего оставлять некий .lock-файл при начале работы скрипта и затирать его в конце - в этом случае повторно запущенный скрипт проверит наличие файла, увидит его существование и откажется запускаться. Для того, чтобы избежать ситуаций, когда скрипт упал, а .lock-файл остался, можно записывать туда PID (идентификатор процесса). В этом случае повторно запущенный скрипт опрашивает ОС на предмет наличия процесса с таким PID, и если последний существует, то необходимо прекратить работу.
1
3 / 3 / 0
Регистрация: 26.07.2012
Сообщений: 122
10.07.2018, 17:48  [ТС]
Torovich,
Jewbacabra,
koders,

Спасибо вам за потраченное время. В особенности мня подтолкнул пост koders,
поскольку это мелкий скрипт для своих задач то мне подойдет такой вариант.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
        $n=0;
        while(!feof($file)){
            $n++;
            if($n>100){
                $stmt = $dbh->prepare("UPDATE csv SET `line`=:n WHERE id = 1");
                $sqldata = [':n'=>$n];
                $stmt->execute($sqldata);
                $csv_st = fgetcsv($file, '"', ';');
                wtfarrey($csv_st);
            }else{
                fgetcsv($file, '"', ';');
            }
        }
хотя признаюсь что для более серьезных вещей все же стоит изучить вопрос с курсором, и решать эту задачу через эти функции.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.07.2018, 17:48
Помогаю со студенческими работами здесь

Построчное чтение текстового отчета msinfo32
Здравствуйте. Через fopen() и fgets() пытаюсь прочитать строки из текстового отчета msinfo32 и получаю проблемы с кодировкой символов...

Построчное чтение из файла до первой пустой строки
Нужно прочитать файл построчно. В файле встречается одна строка пустая строка. Если она встречается, то нужно выйти из цикла. Вроде не...

Чтение csv-файла с кириллицей
Здравствуйте. На странице сайта есть функционал чтения csv-файлов, которые пользователь может выбрать со своего компьютера через форму,...

Чтение csv файла в массив
подскажите пожалуйста как можно из одного массива сделать два. Есть csv фаил где храняться имена и фамилии учащихся. Как можно это...

Чтение CSV файла не построчно, а колонками
Всем привет Возник вопрос как мне почитать CSV файл не по строчна а колонками вид в файле ID,DATA 11,222 23,123


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru