日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

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

發布時間:2024/4/18 php 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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文件操作-将其他文件的数据添加到本文件中的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。