2010-09-23 15 views
1

J'ai deux blocs de texte contenant les noms de sociétés. Les deux contiennent des noms de centaines d'entreprises, la nouvelle liste a plus d'entreprises. Comment est-ce que je supprime les noms de compagnie en double des deux listes, de sorte que je me retrouve avec les nouveaux noms seulement? bloc de texte Exemple un:Comparaison de blocs de texte pour un contenu similaire

Company Name One, Address line 1, line 2, phone, email 
.. 
Random text 
.. 

Company Name Two 
Address, Phone,email 
.. 
Random text 
.. 
Company Name 3 
Address, Phone,email 

bloc de texte Exemple deux:

..Random Text.. 
M/s Company Name One Extra Random Text, Address line 1, line 2, phone, 
..random text... 
M/s Company Name Two 
Address, Phone 
... 

Le nom de la société, adresse, etc sont similaires pas la même. Le deuxième bloc contient les mots M/s avant tous les noms de sociétés. Je voudrais faire cela en php, en utilisant regex peut-être.

Je voudrais sortir les noms de sociétés qui correspondent, par exemple. Dans l'exemple donné ci-dessus, je voudrais sortir que les noms de sociétés: Nom de l'entreprise Un, Nom de l'entreprise deux sont communs aux deux blocs de test.

Mise à jour: grâce à @Wrikken, j'ai le texte dans deux chaînes. Je peux exploser le deuxième bloc en utilisant le M/s, et obtenir un tableau. Comment puis-je vérifier chaque élément de ce tableau pour faire correspondre le premier bloc de texte qui est une longue chaîne?

Bien que, depuis que j'ai fait le travail manuellement, j'aimerais toujours savoir comment deux blocs de texte peuvent être comparés pour la similarité et donc la prime.

Update: sortie pour le code @Joyce Babu

..Random Text.. ..Random Text.. ..Random Text.. ..Random Text.. ..Random Text.. ..Random Text.. ..Random Text.. ..Random Text.. ..Random Text.. ..Random Text.. M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, ..random text... ..random text... ..random text... ..random text... ..random text... ..random text... ..random text... ..random text... ..random text... ..random text... M/s Company Name Two M/s Company Name Two M/s Company Name Two M/s Company Name Two M/s Company Name Two M/s Company Name Two M/s Company Name Two M/s Company Name Two M/s Company Name Two M/s Company Name Two Address, Phone Address, Phone Address, Phone Address, Phone Address, Phone Address, Phone Address, Phone Address, Phone Address, Phone Address, Phone ... ... ... ... ... ... ... ... ... ... ... ... 

sortie pour @nikic

array(2) { [0]=> string(17) "..Random Text.. " [4]=> string(16) "Address, Phone " } 

sortie pour @Joyce Babu second poteau

andom Text..andom Text..andom Text..andom Text..andom Text..andom Text..andom Text..andom Text..andom Text..andom Text..Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,andom text...andom text...andom text...andom text...andom text...andom text...andom text...andom text...andom text...andom text...Company Name TwoCompany Name TwoCompany Name TwoCompany Name TwoCompany Name TwoCompany Name TwoCompany Name TwoCompany Name TwoCompany Name TwoCompany Name Tworess, Phoneress, Phoneress, Phoneress, Phoneress, Phoneress, Phoneress, Phoneress, Phoneress, Phoneress, Phone 

@Joyce Babu final Code de

<?php 
set_time_limit(500); 
$arOld = file('olddata.txt'); 
$arNew = file('newdata.txt'); 
$G=0; 
    $c=0; 

    foreach($arNew as $line){ 
    if(substr($line, 0, 4) == 'M/s '){ 
    $c++; 
    echo "<BR/>".$c.".)"; 
     $line = trim(substr($line, 4)); 
     foreach($arOld as $old){ 
      similar_text($line, $old, $percentage); 
      if ($percentage > 80){ 
       continue; 
      } 
     } 
     echo $line; 
    }else{ 
    $G++; 
    } 
} 
echo "<br/>".$G . " DID NOT MATCH"; 
?> 

@ sortie de Joyce Babu code final

1.)Company Name One Extra Random Text, Address line 1, line 2, phone, 
2.)Company Name Two 
4 DID NOT MATCH 
+1

Est-ce que les deux blocs de texte exactement comme dans votre exemple de texte? Si c'est le cas, que voulez-vous garder? Que voulez-vous supprimer? Si ce n'est pas le cas, je pense que vous devriez poster un exemple de texte qui ressemble exactement à vos deux blocs de texte. Si vous le faites, je pourrais être en mesure de vous aider. – matsolof

+0

@matsolof. J'ai mis à jour la question – abel

+1

Est-ce une ligne par enregistrement? Est-ce que leurs lignes peuvent être des données aléatoires entre deux enregistrements? –

Répondre

2

Essayez cette

set_time_limit(500) 
$arOld = file('olddata.txt'); 
$arNew = file('newdata.txt'); 
foreach($arNew as $line){ 
    if(substr($line, 0, 3) === 'M/s '){ 
     $line = trim(substr($line, 3)); 
     foreach($arOld as $old){ 
      similar_text($line, $old, $percentage); 
      if ($percentage > 80){ 
       continue; 
      } 
     } 
     echo $line; 
    } 
} 
+0

mis à jour le post original sans out mis. – abel

+1

Pouvez-vous répondre à mon commentaire sur le poste oringal? –

+0

a mis à jour le code pour vérifier uniquement les lignes commençant par M/S. Correction d'une erreur –

1

si vous devez comparer liste une seule fois, je vous suggère de convertir docs à txt et vous » ll sera en mesure de comparer en utilisant regex. sinon vous devrez utiliser un logiciel tiers pour accéder aux informations dans les documents ... comme ici peut-être Reading/Writing a MS Word file in PHP

+0

n'est pas une application publique. donc je ne serais que trop heureux de copier la pâte dans un formulaire. – abel

2

Créer un tableau des deux (éventuellement en utilisant la fonction file(), selon le format du texte, ou éventuellement juste explode() sur le contenu) et utilisez array_diff().

1
$oldList = file('oldList.txt'); 
$newList = file('newList.txt'); 
$list = array_udiff($newList, $oldList, 'compare'); 

function compare($new, $old) { 
    similar_text($old, substr($new, 3), $percent); 
    return $percent >= 80 ? 0 : 1; 
} 

Ceci est mon idée de base. Pour trouver tous les textes similaires de 80% et les retirer du $newList. Vous devriez ajuster le pourcentage pour satisfaire vos besoins. Le M/s est supprimé par substr($new, 3).

+0

merci pour le code. Je reçois un délai de 60s en comparant les deux blocs (chaque bloc est d'environ 80kb) – abel

+0

Ajouter set_time_limit (500); au début du code –

+0

J'ai ajouté un var_dump ($ list); la sortie est enregistrée dans la question d'origine – abel

1

S'il n'y a pas de champs clés pour identifier de manière unique les enregistrements, je pense que vous devrez utiliser quelque chose comme similar_text ou levenshtein.

$arOld = file('olddata.txt'); 
$arNew = file('newdata.txt'); 
foreach($arNew as $line){ 
    $line = trim(substr($line, 3)); 
    foreach($arOld as $old){ 
    similar_text($line, $old, $percentage); 
    if ($percentage < 60){ 
     echo $line; 
    } 
    } 
} 
+0

Nouvelle variable indéfinie sur la ligne 6 – abel

+1

$ line, not $ new. Pardon. –

+0

pas de problème! ... – abel