0

我得到了一个包含类似于这种结构的文件:

12345    ABC  100M 001   2.0  ABC    1010  4510  A01 451  Apple, Johnny A  150

12345    ABC  100M 011   2.0  ABC    1010  4510  A01 451  Apple, Johnny A  80

12345    ABC  100 011   2.0  ABC    1010  4510  A01 451  Apple, Johnny A  80

我需要从这个文件中获取以下部分:

  • 如果它们相似,则将第三列(即 100M)组合在一起
  • 将第四列加在一起(如果它们与第三列在同一组中)
  • 根据第四列将最后一列相加

我设法做到了以下几点:

$List1 = array();
$grab = fopen("file.txt", "r") or die("Can't open file");
$check = fgets($grab);

 while(!feof($grab)) {    
   if (ereg("^[[:digit:]]{5} +ABC +([[:digit:]]{3}[[:alpha:]]?)+ ([[:digit:]]{3})",
     $check, $output)) {
  if (!in_array($output[1], $List1)) {      
    array_push($List1, $output[1]);               
  } 
      if (!in_array($output[2], $List1)) {        
    array_push($List1, $output[2]);                    
  } 
}    
$check = fgets($grab);
 }     
 fclose($grab); 

foreach ($List1 as $list) {
   print "$list <br/>";     
 }

我设法以某种方式将第三列组合在一起。
正在显示第四列,但如果它在同一组下,我不确定如何将它组合到第三列中。
而且我不确定如何轻松获取文件/数组中的最后一位。有没有捷径可以获取文件中的最后一个并将它们相加?

提前感谢任何可以帮助我的人。

4

1 回答 1

0

这应该这样做:

$string = '12345    ABC  100M 001   2.0  ABC    1010  4510  A01 451  Apple, Johnny A  150

12345    ABC  100M 011   2.0  ABC    1010  4510  A01 451  Apple, Johnny A  80

12345    ABC  100 011   2.0  ABC    1010  4510  A01 451  Apple, Johnny A  80';

$third = array();
$fourth = array();

foreach (explode("\n", $string) as $line)
{
    // Skip empty lines.
    if (empty($line))
        continue;

    // Clean up any excessive white space.
    $line = trim(preg_replace('~[\s]{2,}~', ' ', $line));

    $info = explode(' ', $line);

    if (!isset($third[$info[2]]))
        $third[$info[2]] = array();

    $third[$info[2]][] = $info;

    if (!isset($fourth[$info[3]]))
        $fourth[$info[3]] = 0;

    $fourth[$info[3]] += (int) end($info);
}

print_r(array(
    'third' => $third,
    'fourth' => $fourth,
));
于 2012-11-02T04:36:39.310 回答