首頁  >  文章  >  後端開發  >  php檔案操作-將其他文件的資料加入本文件中

php檔案操作-將其他文件的資料加入本文件中

不言
不言原創
2018-04-04 14:43:551535瀏覽

這篇文章的內容是php檔案操作-將其他檔案的資料加入本檔案中,現在分享給大家,有需要的朋友可以參考一下

GitHub原始碼
其實我們的程式基於下面的問題寫的答案:

有兩個文字檔案A.txt B.txt
A.txt 3000萬行,userid唯一,userid和username以空格分隔,如下所示:
userid  username
1       yi
2       er
3       san
#…     …
B.txt 3000萬行,userid,useridrealsname #txtid ##userid  realname
1       一
2       二
3       三
…     …
txt 找出一段程式碼,找出B.usernameuserid對應的#…     …
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 = &#39; &#39;;
    }    return explode($delimiter, $lineData);
}

function encodeLine(array $dataList, string $delimiter = null)
{    if (is_null($delimiter)) {        $delimiter = &#39; &#39;;
    }    return implode($delimiter, $dataList);
}$testA = fopen(&#39;./TestData/FileOperation/testA.txt&#39;, &#39;r&#39;);$testB = fopen(&#39;./TestData/FileOperation/testB.txt&#39;, &#39;r+&#39;);$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], [&#39;ASCII&#39;, &#39;UTF-8&#39;, &#39;GB2312&#39;]);            $resStr = mb_convert_encoding($aList[1], &#39;UTF-8&#39;, $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 ##1       一
2       二
3       三
…     …
請寫一段程式碼,將B.txt中userid對應的username在A.txt裡找出來,
請寫一段程式碼,將B.txt中的對應的username在A.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 = &#39; &#39;;
    }    return explode($delimiter, $lineData);
}

function encodeLine(array $dataList, string $delimiter = null)
{    if (is_null($delimiter)) {        $delimiter = &#39; &#39;;
    }    return implode($delimiter, $dataList);
}$testA = fopen(&#39;./TestData/FileOperation/testA.txt&#39;, &#39;r&#39;);$testB = fopen(&#39;./TestData/FileOperation/testB.txt&#39;, &#39;r+&#39;);$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], [&#39;ASCII&#39;, &#39;UTF-8&#39;, &#39;GB2312&#39;]);            $resStr = mb_convert_encoding($aList[1], &#39;UTF-8&#39;, $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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn