本篇文章的内容是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文件操作-将其他文件的数据添加到本文件中相关推荐

  1. linux怎么打开.o文件,Linux下文件I/O操作的相关知识

    Linux文件I/O主要指的是文件的输入输出,很多初学者对文件的I/O不是很了解,Linux文件I/O的操作较多,下面小编就给大家详细介绍下Linux文件I/O. linux 文件I/O教程(1) 一 ...

  2. Java—文件I/O操作

    大多数的应用程序都需要与外部的输入/输出设备I/O(Input/Output)进行数据交换.在Java中,所有的I/O机制都是基于数据"流"方式进行输入/输出.这些"数据 ...

  3. TensorFlow数据读取机制:文件队列 tf.train.slice_input_producer和 tf.data.Dataset机制

    TensorFlow数据读取机制:文件队列 tf.train.slice_input_producer和tf.data.Dataset机制 之前写了一篇博客,关于<Tensorflow生成自己的 ...

  4. 老鱼Python数据分析——篇七:将爬取的数据保存到CSV文件

    使用Python操作CSV文件非常方便,三行代码搞定. 一.向文件中追加数据 import csv# 将数据写入文件 with open("d:\\data.csv", " ...

  5. 服务器excel文件怎么开共享,access服务器局域网EXCEL数据怎么共享

    职场人士经常需要在部门内和不同的员工动态共享某个数据库,下面是学习啦小编给大家整理的一些有关access服务器局域网EXCEL数据共享的方法,希望对大家有帮助! access服务器局域网EXCEL数据 ...

  6. Java工具总结:将数据内容写入excel文件

    Java工具总结:将数据内容写入excel文件 文章目录 Java工具总结:将数据内容写入excel文件 一.背景 二.功能描述 三.使用该工具类:Java代码演示 四.分析代码 4.1 几个重要的J ...

  7. Perl文件及目录操作

    本文转自:http://www.blogjava.net/weidagang2046/articles/61995.html 大多数程序都不是孤立的,它们与它们的环境相互作用.很 多的程序也需要通过文 ...

  8. 不同存储结构的文件磁盘io操作次数_MySQL InnoDB存储引擎

    第1章 MySQL体系结构和存储引擎 1.1数据库和实例 数据库:物理操作系统文件或其他形式文件类型的集合.实例:MySQL数据库由后台线程以及一个共享内存区组成.共享内存可以被运行 的后台线程所共享 ...

  9. 如何把hello.c 输出到txt_如何在程序开发中进行文件的相关操作呢?往这看

    在用Python进行程序开发时,我们不仅会使用代码,更要读取一些文件,来获取其中的信息. 文件是信息的集成者,有其相应的文件系统,在了解Python如何操作文件时,我们先来了解一下,文件的基础--文件 ...

最新文章

  1. Kafka那些值得我们学习的优秀设计
  2. 服务器的图片无法显示,服务器的图片无法显示
  3. 20172311 2017-2018-2 《程序设计与数据结构》第八周学习总结
  4. C语言学习及应用笔记之四:C语言volatile关键字及其使用
  5. 把一个字符串分割成数组 php_php explode 将字符串分割为数组
  6. Pyinstller打包的exe文件反编译
  7. H264格式说明及解析
  8. Alexnet输入大小227x227能否调整,kernel_size偶数有什么影响。
  9. centos gcc卸载_CentOS gcc多版本的卸载与修复
  10. 炸机不可怕,可怕的是你不知道为什么炸
  11. 哪个程序猿还没段风花雪月的错过
  12. 华为hcia-datacom 学习日记
  13. 专题教程——选队长游戏
  14. ospf协议说明之top思路图
  15. Jerry号召广大程序员同仁们,把身体锻炼好,每天把砖搬起来
  16. 微服务框架之微软Service Fabric
  17. mysql计算均线_MySQL移动平均线 – 4周
  18. 计算机组装的品牌价格,图文详解2019组装电脑配置清单及价格推荐
  19. fitnesse java_Fitnesse的一个简单实例
  20. 数据分析·影评可视化分析

热门文章

  1. Runtime Error VS Accepted (大整数排序 )
  2. mac sudo免密码
  3. Docker ASP.NET Core (5):Docker Compose
  4. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 四
  5. C实战:项目构建Make,Automake,CMake
  6. java ML回归预测_ML之回归预测:利用九大类机器学习算法对无人驾驶汽车系统参数(2018年的data,18+2)进行回归预测值VS真实值...
  7. 【数据结构与算法】之深入解析“下一个更大元素III”的求解思路与算法示例
  8. HarmonyOS之常用组件WebView的使用
  9. iOS之深入解析内存管理的引用计数retainCount的底层原理
  10. OpenGL之控制渲染图形的移动