У меня есть простой 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, вам нужно будет прочитать весь файл в памяти, прежде чем вы сможете выполнить проверку, которая вам нужна. Вот пример, который предполагает многое и может использовать некоторую проверку ошибок и оптимизацию, но может помочь вам преодолеть это препятствие.
$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 />";
}
С текущей структурой кода это невозможно, потому что вы читаете это построчно и у вас нет возможности вернуться назад или вперед, чтобы выбрать другую строку. Вероятно, вам следует прочитать этот файл в массив, где каждый элемент является строкой. Таким образом, вы можете использовать индекс массива для перехода назад/вперед.