php檔案操作-將其他檔案的資料添加到本檔案中

來源:互聯網
上載者:User

本篇文章的內容是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索引的做法?

<?phpheader("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索引的做法?

<?phpheader("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);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.