PHP: Найдите строку в CSV, распечатайте ее, а также строку X строк перед ней и другую строку X строк после нее

У меня есть простой CSV-файл из 275+/- строк, содержащий даты открытия фондовой биржи США, а также время дня, когда она открывается и закрывается. Меня интересует только дата, которая находится в позиции индекса «0» каждой строки.

например

2022-04-01,2022-04-01 13:30:00+00:00,2022-04-01 20:00:00+00:00

Я могу найти и распечатать дату, которую я ищу, и я могу использовать это, чтобы найти номера строк строк, которые являются строками x до и строк после этого (я использую 14 дней в качестве примера в коде, который я включены), но я не знаю, как извлечь даты из двух последних. Любая помощь будет оценена по достоинству.

Код, который я использую для поиска заданной даты.

$lines = 'market_schedule.csv';
$date = '2022-04-01';

$row = 1;
if (($handle = fopen($lines, "r")) !== FALSE) {
    fgetcsv($handle, 1000, ",");
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $row++;
        if (($data[0] == $date)){
            echo $data[0] . " is on line ".$row."<br />";
            // $prev = [$row - 14];
            // echo "Line " . $prev[0] . " is 14 lines prior.<br />";
            // $fut = [$row + 14];
            // echo "Line " . $fut[0] . " is 14 lines after.<br />";
        }
    }
fclose($handle);
}

С текущей структурой кода это невозможно, потому что вы читаете это построчно и у вас нет возможности вернуться назад или вперед, чтобы выбрать другую строку. Вероятно, вам следует прочитать этот файл в массив, где каждый элемент является строкой. Таким образом, вы можете использовать индекс массива для перехода назад/вперед.

Andrea Olivato 06.04.2022 04:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как упомянул @Andrea, вам нужно будет прочитать весь файл в памяти, прежде чем вы сможете выполнить проверку, которая вам нужна. Вот пример, который предполагает многое и может использовать некоторую проверку ошибок и оптимизацию, но может помочь вам преодолеть это препятствие.

$lines = 'market_schedule.csv';
$date = '2022-04-01';

$matchedRow = 0;
$row = 1;
$allRows = [];
if (($handle = fopen($lines, "r")) !== FALSE) {
    fgetcsv($handle, 1000, ",");
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $row++;
        $allRows[] = $data;

        if ($data[0] == $date){
            $matchedRow = $row;
        }   
    }
    fclose($handle);
}

$rowOffset = 14;
if ($matchedRow > 0) {
    echo $allRows[$matchedRow][0] . " is on line $matchedRow <br />";

    // You'll need to error check that $prev and $fut
    // are valid rows
    $prev = $matchedRow-$rowOffset;
    $fut = $matchedRow+$rowOffset;
    
    echo "Line " . $allRows[$prev][0] . " is $rowOffset lines prior.<br />";
    echo "Line " . $allRows[$fut][0] . " is $rowOffset lines after.<br />";
} else {
    echo "Didn't find a date match.<br />";
}

Другие вопросы по теме