php文件操作-将其他文件的数据添加到本文件中

GitHub源码
其实我们的程序基于下面的问题写的答案:

有两个文本文件 A.txt B.txt
A.txt 3000万行,userid唯一,userid和username以空格分隔,如下所示:
userid username
1 yi
2 er
3 san
… …
B.txt 3000万行,userid唯一,userid和realname以空格分隔,如下所示:
userid realname
1 一
2 二
3 三
… …
请写一段代码,将B.txt中userid对应的username在A.txt里找出来,填充到B.txt的第三列,并给出时间复杂度。

在我们的程序中,是默认两个文件的行数据是一一对应的,即A的第n行数据对应B的第n行数据,这样我们的程序的时间复杂度是O(n)。

但是在实际操作中,肯定会遇到两个文件的数据行不是一一对应的情况,这样的话我只想到了最简单的时间复杂度为O(n^2)的操作,不知道有没有更好的算法解决这个问题。

如果把文件读出,构建为一个查询为O(1)或O(logn)的数据结构,这样应该复杂度会成为O(n)或O(nlogn),不过遇到文件过大,构建的数据结构太大的情况该如何应对,借鉴数据库b-tree索引的做法?

<?php
header("content-type:text/html;charset=utf-8");

function decodeLine(string $lineData, string $delimiter = null)
{
    if (is_null($delimiter)) {
        $delimiter = ' ';
    }
    return explode($delimiter, $lineData);
}

function encodeLine(array $dataList, string $delimiter = null)
{
    if (is_null($delimiter)) {
        $delimiter = ' ';
    }
    return implode($delimiter, $dataList);
}


$testA = fopen('./TestData/FileOperation/testA.txt', 'r');

$testB = fopen('./TestData/FileOperation/testB.txt', 'r+');

$tmpFile = tmpfile();
//
while (($bBuffer = fgets($testB)) != false) {
    $bList = decodeLine(trim($bBuffer, "\n\r"));
    $tmpList = $bList;
    if (($aBuffer = fgets($testA)) != false) {
        $aList = decodeLine(trim($aBuffer, "\n\r"));
        if ($aList[0] == $bList[0]) {
            $strEncoding = mb_detect_encoding($aList[1], ['ASCII', 'UTF-8', 'GB2312']);
            $resStr = mb_convert_encoding($aList[1], 'UTF-8', $strEncoding);
            array_push($tmpList, $resStr."\n");
        }
    }
    fwrite($tmpFile, encodeLine($tmpList));
}

rewind($tmpFile);
rewind($testB);

while (!feof($tmpFile)) {
    $tmpBuffer = fread($tmpFile, 1024);
    fwrite($testB, $tmpBuffer);
}


fclose($tmpFile);
fclose($testA);
fclose($testB);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值