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 />";
}
我有一个简单的 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 />";
}