PHP:在 CSV 中查找一个字符串,打印它以及它前面 X 行的一行,以及它后面 X 行的另一行

PHP: Find a string in a CSV, print it as well as a line X rows before it, and another line X rows after it

我有一个简单的 275+/- 行 CSV 文件,其中包含日期 U.S。证券交易所开市,以及开市和闭市的时间。我只关心日期 - 它位于每行的索引位置“0”。

例如

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

我可以找到并打印我正在寻找的日期,我可以用它来找到之前 x 行和之后 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 />";
}