Php循环并通过txt文件计数

时间:2016-10-21 15:18:49

标签: php file count

我遇到了一个复杂的问题。在工作中,我们必须每月计算我们的库存。这是通过扫描仪完成的。每个地点最多可以有100种不同的物品。必须扫描每个项目,甚至是同一类。扫描完每个位置后,我们会打印出已扫描的项目列表。问题是每个扫描在txt文件中都有自己的行(它没有添加/减去同一项的多个计数)

由于我们系统的供应商在执行新功能方面出了名的慢,我想到了一个执行以下操作的PHP脚本:

  • 1:读取txt文件中的每一行
  • 2:添加/减去相同项目的计数
  • 3:打印出包含商品编号和计数的列表。

txt文件如下:

01234+000001N

前5位数是项目编号。由于可以添加和减去下一个符号是+或 - 然后接下来的5位是计数,N是" eol"

所以不知怎的,我必须将它全部放在某种数组中并按项目编号排序。然后添加/减去最后打印出最终列表

3 个答案:

答案 0 :(得分:0)

假设您已将文件逐行加载到字符串中,并按新行拆分,则可以执行以下操作: (阅读代码评论)

$strTxtFile = <<<TXT
01234+000001N
01234+000001N
09876+000002N
01234+000001N
01234+000001N
09876+000002N
01234-000001N
09876+000002N
TXT;

/**
 * 01234 should have 3 stock
 * 09876 should have 6 stock
 */

$arrProducts = array();
$arrFileLines = explode(PHP_EOL, $strTxtFile);
foreach($arrFileLines as $strFileLine) {
    //Split the lines by the action (+/-)
    $arrStockAction = preg_split("/(\+|\-)/", $strFileLine, NULL, PREG_SPLIT_DELIM_CAPTURE);

    $strProductCode = $arrStockAction[0]; //The first part is the product code
    $strAction = $arrStockAction[1]; //The action (+/-) to the stock
    $intStockAmount = (int) $arrStockAction[2]; //Cast it to an int to get the number

    //Check if the product exists in our array, if not, create it with 0 stock
    if( array_key_exists($strProductCode, $arrProducts) === FALSE ) {
        $arrProducts[$strProductCode] = 0;
    } 

    if($strAction === "+") {
        //Add stock
        $arrProducts[$strProductCode] += $intStockAmount;
    } else {
        //Minus stock
        $arrProducts[$strProductCode] -= $intStockAmount;
    }
}

print_r($arrProducts);

https://repl.it/ECrW

答案 1 :(得分:0)

与其他答案类似,可能更简单一点:

foreach(file('/path/to/file.txt') as $line) {
    $item = substr($line, 0, 5);
    $sign = substr($line, 5, 1);
    $qty  = substr($line, 6, 6);

    if(!isset($result[$item])) {
        $result[$item] = $qty;
    } else {
        $result[$item] += $sign.$qty;
    }
}

或者将substr()行替换为:

preg_match('/(\d{5})(.)(\d{6})/', $line, $matches);

并使用$matches[1]$matches[2]$matches[3]

答案 2 :(得分:0)

我刚发现我误读了txt文件。这些行如下:

01234000001 N

01234000001-N

最后一个数字和N之间的空格表示加法和 - substract