Der Inhalt dieses Artikels ist der PHP-Dateivorgang. Fügen Sie Daten aus anderen Dateien zu dieser Datei hinzu und teilen Sie sie jetzt mit allen. Freunde in Not können darauf verweisen.
GitHub-Quellcode
Tatsächlich Unser Programm schreibt Antworten basierend auf den folgenden Fragen:
Es gibt zwei Textdateien A.txt B.txt
A.txt 30 Millionen Zeilen, Benutzer-ID ist eindeutig, Benutzer-ID und Benutzername sind durch Leerzeichen getrennt, wie unten gezeigt:
userid username
1 yi
2 er
3 san
… …
B.txt 30 Millionen Zeilen, userid ist eindeutig, userid und realname werden durch Leerzeichen getrennt , wie unten gezeigt:
realname der Benutzer-ID
1 eins
2 zwei
3 drei
… …
Bitte schreiben Sie einen Code, um den Benutzernamen zu finden, der der Benutzer-ID in B.txt entspricht A.txt und füllen Sie es aus. Gehen Sie zur dritten Spalte von B.txt und geben Sie die Zeitkomplexität an.
In unserem Programm stehen die Zeilendaten der beiden Dateien standardmäßig in einer Eins-zu-Eins-Entsprechung, das heißt, die n-te Datenzeile in A entspricht der n-ten Datenzeile in B. In diesem Somit beträgt die zeitliche Komplexität unseres Programms O(n).
Aber im tatsächlichen Betrieb wird es definitiv eine Situation geben, in der die Datenzeilen der beiden Dateien nicht eins zu eins übereinstimmen. In diesem Fall denke ich nur an die einfachste Operation mit einer Zeitkomplexität von O(. n^2), ich weiß nicht, ob es einen besseren Algorithmus zur Lösung dieses Problems gibt.
Wenn die Datei ausgelesen und als Datenstruktur konstruiert wird, deren Abfrage O(1) oder O(logn) ist, sollte die Komplexität O(n) oder O(nlogn) werden, aber wenn eine Datei angetroffen wird Zu groß, wie gehe ich mit der Situation um, wenn die konstruierte Datenstruktur zu groß ist? Lernen Sie aus der Praxis des Datenbank-B-Tree-Index? Schreiben Sie die Antwort auf die Frage:
<?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);
A.txt 30 Millionen Zeilen, Benutzer-ID ist eindeutig, Benutzer-ID und Benutzername werden durch Leerzeichen getrennt, wie unten gezeigt:
Benutzer-ID-Benutzername1 yi yi
2 er
… …
B.txt 30 Millionen Zeilen, Benutzer-ID ist eindeutig, Benutzer-ID und Realname werden durch Leerzeichen getrennt, wie unten gezeigt:
Userid RealName
2 zwei
3
…
Bitte schreiben Sie einen Code, um den Benutzernamen zu finden, der der Benutzer-ID in b.txt in A.TXT entspricht, und geben Sie ihn in B ein. Die dritte Spalte von txt gibt die Zeitkomplexität an.
In unserem Programm stehen die Zeilendaten der beiden Dateien standardmäßig in einer Eins-zu-Eins-Entsprechung, das heißt, die n-te Datenzeile in A entspricht der n-ten Datenzeile in B. In diesem Somit beträgt die zeitliche Komplexität unseres Programms O(n).
Aber im tatsächlichen Betrieb wird es definitiv eine Situation geben, in der die Datenzeilen der beiden Dateien nicht eins zu eins übereinstimmen. In diesem Fall denke ich nur an die einfachste Operation mit einer zeitlichen Komplexität von O(. n^2), ich weiß nicht, ob es einen besseren Algorithmus zur Lösung dieses Problems gibt.
Wenn die Datei ausgelesen und als Datenstruktur konstruiert wird, deren Abfrage O(1) oder O(logn) ist, sollte die Komplexität O(n) oder O(nlogn) werden, aber wenn eine Datei angetroffen wird Zu groß, wie geht man mit der Situation um, wenn die konstruierte Datenstruktur zu groß ist? Lernen Sie aus der Praxis des Datenbank-B-Tree-Index
Verwandte Empfehlungen:
Erfassung von PHP-Dateioperationen, Dateien in einem Verzeichnis und Methoden zur Berechnung relativer Pfade<?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);
Patch-Datei PHP-Dateioperation-Implementierungscode-Sharing
Das obige ist der detaillierte Inhalt vonPHP-Dateioperation – Daten aus anderen Dateien zu dieser Datei hinzufügen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!