欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > php >内容正文

php

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

发布时间:2024/4/18 php 53 豆豆
生活随笔 收集整理的这篇文章主要介绍了 php操作外部文件,php文件操作-将其他文件的数据添加到本文件中 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

本篇文章的内容是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);

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);

相关推荐:

总结

以上是生活随笔为你收集整理的php操作外部文件,php文件操作-将其他文件的数据添加到本文件中的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。