Opération de fichier PHP : ajouter des données d'autres fichiers à ce fichier

不言
Libérer: 2023-03-23 08:34:02
original
1545 Les gens l'ont consulté

Le contenu de cet article concerne l'exploitation du fichier php - ajoutez des données d'autres fichiers à ce fichier, partagez-le maintenant avec tout le monde, les amis dans le besoin peuvent s'y référer

Code source GitHub
En fait, notre Le programme écrit des réponses basées sur les questions suivantes :

Il y a deux fichiers texte A.txt B.txt
A.txt 30 millions de lignes, l'ID utilisateur est unique, l'ID utilisateur et le nom d'utilisateur sont séparés par des espaces, comme indiqué ci-dessous :
userid username
1 yi
2 er
3 san
… ...
B.txt 30 millions de lignes, l'ID utilisateur est unique, l'ID utilisateur et le nom réel sont séparés par des espaces, comme indiqué ci-dessous :
nom réel de l'ID utilisateur
1 un
2 deux
3 trois
… …
Veuillez écrire un code pour trouver le nom d'utilisateur correspondant à l'ID utilisateur en B. txt dans A.txt et remplissez-le. Accédez à la troisième colonne de B.txt et indiquez la complexité temporelle.

Dans notre programme, les données de ligne des deux fichiers sont en correspondance biunivoque par défaut, c'est-à-dire que la nième ligne de données dans A correspond à la nième ligne de données dans B. Dans ce Ainsi, la complexité temporelle de notre programme est O(n).

Mais en fonctionnement réel, il y aura certainement une situation où les lignes de données des deux fichiers ne seront pas en correspondance biunivoque. Dans ce cas, je n'ai pensé qu'à l'opération la plus simple avec une complexité temporelle. de O(n^2) , je ne sais pas s'il existe un meilleur algorithme pour résoudre ce problème.

Si le fichier est lu et construit dans une structure de données dont la requête est O(1) ou O(logn), la complexité devrait devenir O(n) ou O(nlogn), mais lorsque vous rencontrez un fichier Trop grande, comment gérer la situation lorsque la structure de données construite est trop grande, apprendre de la pratique de l'indexation b-tree de base de données ?

<?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);
Copier après la connexion
Copier après la connexion

                            Écrivez la réponse à la question :

Il existe deux fichiers texte A.txt B.txt
A.txt 30 millions de lignes, l'ID utilisateur est unique, l'ID utilisateur et le nom d'utilisateur sont séparés par des espaces, comme indiqué ci-dessous :

ID utilisateur nom d'utilisateur

1 yi yi
2 er
3 san san
… …
B.txt 30 millions de lignes, l'ID utilisateur est unique, l'ID utilisateur et le nom réel sont séparés par des espaces, comme indiqué ci-dessous :
userid RealName 1
2 deux
3

Veuillez écrire un code pour trouver le nom d'utilisateur correspondant à l'ID utilisateur dans b.txt dans A.TXT, remplissez-le en B. La troisième colonne de txt et donne le complexité temporelle.

Dans notre programme, les données de ligne des deux fichiers sont en correspondance biunivoque par défaut, c'est-à-dire que la nième ligne de données dans A correspond à la nième ligne de données dans B. Dans ce Ainsi, la complexité temporelle de notre programme est O(n).

Mais en fonctionnement réel, il y aura certainement une situation où les lignes de données des deux fichiers ne correspondent pas une à une. Dans ce cas, je ne pense qu'à l'opération la plus simple avec une complexité temporelle de O(. n^2), je ne sais pas s'il existe un meilleur algorithme pour résoudre ce problème.

Si le fichier est lu et construit comme une structure de données dont la requête est O(1) ou O(logn), la complexité devrait devenir O(n) ou O(nlogn), mais lorsque vous rencontrez un fichier Trop grande, comment gérer la situation lorsque la structure de données construite est trop grande, apprendre de la pratique de l'index b-tree de base de données

Recommandations associées :

<?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);
Copier après la connexion
Copier après la connexion
Acquisition d'opérations sur les fichiers PHP Fichiers dans un répertoire et méthodes de calcul des chemins relatifs

Fichier patch Partage de code d'implémentation des opérations sur les fichiers PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal