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

不言
发布: 2018-04-04 14:43:55
原创
1674人浏览过

本篇文章的内容是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免费学习笔记(深入)”;

<?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);
登录后复制
登录后复制

               

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免费学习笔记(深入)”;

<?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);
登录后复制
登录后复制

相关推荐:

PHP文件操作之获取目录下文件与计算相对路径的方法

patch文件 PHP文件操作实现代码分享

以上就是php文件操作-将其他文件的数据添加到本文件中的详细内容,更多请关注php中文网其它相关文章!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号