如何在csv中搜索特定列中子字符串的数据,并仅提取最近日期的匹配?

问题描述 投票:1回答:1

我试图在文本文件中获取汽车板的最近日期时遇到问题。

我想要做的是找到最新日期值(值索引[6])的行,其中包含板值开头的DPC-5345(值索引[9])。

我在下面的代码中所做的是接收文件中的第一个匹配记录,但它不一定是该板块的最新日期。

$filename = "posicoes.txt";
$fi = fopen($filename, "r+");
$getarray = array();
$row = 1;
if (($handle = $fi) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
            $placa = mb_substr($data[9], 0, 8);
            $getarray[] = array($data[4],$data[5],$data[6],$data[8],$placa);
        }
    }
    fclose($handle);
}
$i=1; 
while($i<=count($getarray)) {
    if ($getarray[$i][4] == 'DPC-5345') {
        break;
    } 
    $i++;
}

无论如何,是否可以可靠地返回搜索板块的最近日期?

"9452995","268460266","1222584",\N,"-22.905745","-47.234562","2019-02-19 14:58:32","1","5.48 Km SSO de HORTOLANDIA, SP - Brasil, 81.00 Km/h","DPC-5345-Sami"
"9452993","268460266","1223268",\N,"-5.873287","-35.220425","2019-02-19 14:58:06","1","6.59 Km NE de PARNAMIRIM, RN - Brasil, 62.00 Km/h","DCC-7567-"
"9452992","268460266","1232171",\N,"-21.832002","-47.250372","2019-02-19 14:57:34","1","0.59 Km SSO de SANTA CRUZ DAS PALMEIRAS, SP - Brasil, 0.00 Km/h","IST-0719-RODO"
"9452994","268460266","1229564",\N,"-20.262012","-42.166750","2019-02-19 14:57:17","1","13.90 Km O de MANHUACU, MG - Brasil, 88.00 Km/h","OHD-3670-SAHI"
"9452990","268460266","1225289",\N,"-18.128898","-48.568003","2019-02-19 14:57:13","1","49.92 Km E de BURITI ALEGRE, GO - Brasil, 0.00 Km/h","GHK-9324-SIRA "
"9452989","268460266","1220268",\N,"-23.625102","-48.097762","2019-02-19 14:57:01","1","5.91 Km SO de ITAPETININGA, SP - Brasil, 0.00 Km/h","DUR-6980-ROBESO"
"9452988","268460266","1235318",\N,"-17.250372","-49.241770","2019-02-19 14:56:42","1","0.20 Km S de PROFESSOR JAMIL, GO - Brasil, 56.00 Km/h","DPD-7548-JOHE"
"9452987","268460266","1222584",\N,"-22.908855","-47.213868","2019-02-19 14:56:32","1","5.66 Km S de HORTOLANDIA, SP - Brasil, 72.00 Km/h","DPC-5345-Sami"
"9452986","268460266","1223268",\N,"-5.886993","-35.232365","2019-02-19 14:56:06","1","4.58 Km NE de PARNAMIRIM, RN - Brasil, 63.00 Km/h","DCC-7567-"
"9452985","268460266","1232171",\N,"-21.831938","-47.250395","2019-02-19 14:55:34","1","0.59 Km SSO de SANTA CRUZ DAS PALMEIRAS, SP - Brasil, 0.00 Km/h","IST-0719-RODO"
"9452983","268460266","1229564",\N,"-20.246693","-42.153427","2019-02-19 14:55:17","1","12.56 Km O de MANHUACU, MG - Brasil, 12.00 Km/h","OHD-3670-SAHI"
"9452982","268460266","1225289",\N,"-18.128867","-48.567983","2019-02-19 14:55:13","1","49.92 Km E de BURITI ALEGRE, GO - Brasil, 0.00 Km/h","GHK-9324-SIRA "
"9452981","268460266","1220268",\N,"-23.625102","-48.097708","2019-02-19 14:55:01","1","5.91 Km SO de ITAPETININGA, SP - Brasil, 0.00 Km/h","DUR-6980-ROBESO"
"9452980","268460266","1235318",\N,"-17.233647","-49.234803","2019-02-19 14:54:42","1","1.82 Km NNE de PROFESSOR JAMIL, GO - Brasil, 88.00 Km/h","DPD-7548-JOHE"
"9452979","268460266","1222584",\N,"-22.898880","-47.214478","2019-02-19 14:54:32","1","4.55 Km S de HORTOLANDIA, SP - Brasil, 81.00 Km/h","DPC-5345-Sami"
"9452978","268460266","1223268",\N,"-5.890597","-35.250160","2019-02-19 14:54:06","1","3.07 Km NNE de PARNAMIRIM, RN - Brasil, 57.00 Km/h","DCC-7567-"
"9452977","268460266","1232171",\N,"-21.831958","-47.250420","2019-02-19 14:53:34","1","0.59 Km SSO de SANTA CRUZ DAS PALMEIRAS, SP - Brasil, 0.00 Km/h","IST-0719-RODO"
"9452968","268460266","1229564",\N,"-20.247340","-42.143567","2019-02-19 14:53:17","1","11.53 Km O de MANHUACU, MG - Brasil, 12.00 Km/h","OHD-3670-SAHI"
"9452966","268460266","1225289",\N,"-18.128913","-48.567978","2019-02-19 14:53:13","1","49.92 Km E de BURITI ALEGRE, GO - Brasil, 0.00 Km/h","GHK-9324-SIRA "
"9452965","268460266","1220268",\N,"-23.625155","-48.097717","2019-02-19 14:53:01","1","5.91 Km SO de ITAPETININGA, SP - Brasil, 0.00 Km/h","DUR-6980-ROBESO"
"9452976","268460266","1235318",\N,"-17.212558","-49.224920","2019-02-19 14:52:42","1","4.39 Km NNE de PROFESSOR JAMIL, GO - Brasil, 75.00 Km/h","DPD-7548-JOHE"
"9452964","268460266","1222584",\N,"-22.884487","-47.231652","2019-02-19 14:52:32","1","3.15 Km SSO de HORTOLANDIA, SP - Brasil, 73.00 Km/h","DPC-5345-Sami"
"9452962","268460266","1223268",\N,"-5.890032","-35.264475","2019-02-19 14:52:06","1","2.82 Km N de PARNAMIRIM, RN - Brasil, 40.00 Km/h","DCC-7567-"
"9452961","268460266","1232171",\N,"-21.831912","-47.250373","2019-02-19 14:51:34","1","0.58 Km SSO de SANTA CRUZ DAS PALMEIRAS, SP - Brasil, 0.00 Km/h","IST-0719-RODO"
"9452959","268460266","1229564",\N,"-20.246538","-42.153748","2019-02-19 14:51:17","1","12.60 Km O de MANHUACU, MG - Brasil, 65.00 Km/h","OHD-3670-SAHI"
"9452958","268460266","1225289",\N,"-18.128877","-48.568017","2019-02-19 14:51:13","1","49.92 Km E de BURITI ALEGRE, GO - Brasil, 0.00 Km/h","GHK-9324-SIRA "
"9452963","268460266","1220268",\N,"-23.625228","-48.097698","2019-02-19 14:51:01","1","5.92 Km SO de ITAPETININGA, SP - Brasil, 0.00 Km/h","DUR-6980-ROBESO"
"9452975","268460266","1235318",\N,"-17.197180","-49.208607","2019-02-19 14:50:42","1","6.71 Km NNE de PROFESSOR JAMIL, GO - Brasil, 86.00 Km/h","DPD-7548-JOHE"
"9452957","268460266","1222584",\N,"-22.875095","-47.253175","2019-02-19 14:50:32","1","3.88 Km SO de HORTOLANDIA, SP - Brasil, 76.00 Km/h","DPC-5345-Sami"
php arrays search fopen fgetcsv
1个回答
1
投票

假设第一次遇到的比赛是最近的......

在文件数据的单次迭代中执行板搜索,然后在找到时执行break

$search_plate = "DPC-5345";    
$filename = "posicoes.txt";
$first_encountered_match = [];
if (($handle = fopen($filename, "r+")) === false) {
    echo "failed to access file";
} else {
    while (($data = fgetcsv($handle, 1000, ",")) !== false) {
        if (mb_strpos($data[9], $search_plate) === 0) {
            first_encountered_match = $data;
            break;
        }
    }
   fclose($handle);
}
var_export(first_encountered_match);

由于循环中的break,上面的效率更高(没有浪费的迭代)。

如果你不能依赖于排序,那么你将不得不检查所有符合条件的匹配的日期并迭代整个数据集(不间断)。

$search_plate = "DPC-5345";    
$filename = "posicoes.txt";
$most_recent_match = [];
if (($handle = fopen($filename, "r+")) === false) {
    echo "failed to access file";
} else {
    while (($data = fgetcsv($handle, 1000, ",")) !== false) {
        if (mb_strpos($data[9], $search_plate) === 0 && (!$most_recent_match || $data[6] > $most_recent_match[6])) {
            $most_recent_match = $data;
        }
    }
   fclose($handle);
}
var_export($most_recent_match);

PHP手册@ http://php.net/manual/en/function.strstr.php中的注释说明了有效搜索是否存在应用于mb_substr()的子串。因为你只想检查字符串值的开头是否出现在目标元素的开头,所以这个工作的最佳工具是mb_strpos(),严格检查0

正如@Raptor警告的那样:

  1. 如果您不需要多字节字符串处理,则可以从mb_调用中删除strpos()以提高效率。
  2. 如果您要对此存储数据进行频繁搜索,并且需要在匹配上编写合格条件,那么最明智的建议是将数据存储在数据库中。 SQL将被证明是一种更清洁,更简单,更高效,更强大的工具,可满足您的要求。
© www.soinside.com 2019 - 2024. All rights reserved.