使用php将csv文件中的数据从一行匹配到另一行?

使用php将csv文件中的数据从一行匹配到另一行?,php,regex,csv,Php,Regex,Csv,我是php的新手。这能做到吗??脚本角色是在另一行中查找匹配项,但不在同一列中 .csv文件 **first row** **second row** **third row** This is for NNMM NN/MM@000-45NNMM;1 2001 AA/BB@000-45AABB;2 ----- 2002 NN/MM@000-45NNMM;2 ---

我是php的新手。这能做到吗??脚本角色是在另一行中查找匹配项,但不在同一列中

.csv文件

**first row**            **second row**         **third row** 

  This is for NNMM        NN/MM@000-45NNMM;1      2001
  AA/BB@000-45AABB;2      -----                   2002
  NN/MM@000-45NNMM;2      -----                   2003
  This is for XXYY        XX/YY@000-45XXYY;1      2004
  LL/QQ@000-45LLQQ;2      -----                   2005
  WW/KK@000-45WWKK;2      -----                   2006
  CC/DD@000-45CCDD;2      -----                   2005
  PP/SS@000-45PPSS;2      -----                   2006
  This is for AABB        AA/BB@000-45AABB;1      2007
  XX/YY@000-45XXYY;2      -----                   2008
  This is for PPSS        PP/SS@000-45PPSS;1      2009
  This is for CCDD        CC/DD@000-45CCDD;1      2010
第一行:有5个字段,字符串中的最后一个字符是“2”(即AA)/BB@000-45AABB;2)

第二行:有5个字段,字符串中的最后一个字符是“1”(即AA)/BB@000-45AABB;1)

现在我想做一个匹配脚本,第一行在2ndrow中找到匹配项。。并显示找到匹配项的第一行中的数据。。。希望它有意义

期望输出

  This is for NNMM        NN/MM@000-45NNMM;1      2001
  This is for XXYY        XX/YY@000-45XXYY;1      2004
  This is for AABB        AA/BB@000-45AABB;1      2007
  This is for PPSS        PP/SS@000-45PPSS;1      2009
  This is for CCDD        CC/DD@000-45CCDD;1      2010
我已经开始了一个脚本,但坚持与逻辑工作

$file  = fopen('sample.csv', 'r');
echo "<table style='border: 2px solid black; text-align:left'>";
while (($line = fgetcsv($file)) !== FALSE) {  
    list( $row1, $row2, $row3) = $line;

        echo "<tr>";
        echo "<td>$row1</td>"; 
        echo"<td>$row2</td>"; 
        echo "<td>$row3</td>";
        echo "</tr>";       

}
echo "</table>"; 
$file=fopen('sample.csv','r');
回声“;
而(($line=fgetcsv($file))!==FALSE){
列表($row1、$row2、$row3)=$line;
回声“;
回显“$row1”;
回显“$row2”;
回显“$row3”;
回声“;
}
回声“;

这可能不是最好的工具,但我试着用regex来做,我知道这很难看,但试一下:

(?|(?:([A-Z]{2}\/[A-Z]{2}@\d{3}-\d{2}([A-Z]{4});)(1))(?=(?:.|\n)+?(\d{4})(?:.|\n)+\1(?:2))|(?:([A-Z]{2}\/[A-Z]{2}@\d{3}-\d{2}([A-Z]{4});)2)(?=(?:.|\n)+(?:\1(1))(?:.|n)+?(\d{4})))

相关数据是分组的,因此您可以使用类似于“这是$2\t$1\t$3\t$4”的内容来获取所需的数据。在我的演示的替换部分,您可以看到输出(但它只替换匹配的部分,其余的umatched文本仍然存在,但这只是为了查看这样的输出的外观)。

使用do while()而不是while sorry不能为您编写代码


您还必须使用if语句if($row1==$row1){然后执行此操作}

可怕的!:)为什么不使用数据库?对不起,先生,但是csv…我怎样才能只显示匹配文件?我在脚本中插入了它,但它不起作用……我不擅长php,但您可以使用preg_match_all,您将在数组中获得所有结果,然后从them@Bee超过十个什么?php中没有针对每个循环的csv文件?csv文件包含数千列。。。该示例仅显示5个匹配项。。。。如果他们的匹配是10或100,该怎么办?@Bee但它似乎可以处理更多的行,例如。但这是你的决定