2010-10-24 30 views
0

J'ai un très gros fichier .txt avec la commande de nos clients et je dois le déplacer dans une base de données mysql. Cependant, je ne sais pas quel genre de regex utiliser car l'information n'est pas très différente.php, preg_match, regex, extraire du texte spécifique

 
----------------------- 
4046904 


KKKKKKKKKKK 
Laura Meyer 
MassMutual Life Insurance 
153 Vadnais Street 

Chicopee, MA 01020 
US 
413-744-5452 
[email protected] 


KKKKKKKKKKK 
373074210772222 02/12 6213 NA 
----------------------- 
4046907 


KKKKKKKKKKK 
Venkat Talladivedula 

6105 West 68th Street 

Tulsa, OK 74131 
US 
9184472611 
venkat.talladivedula... 


KKKKKKKKKKK 
373022121440000 06/11 9344 NA 
----------------------- 

J'ai essayé quelque chose, mais je ne pouvais pas extraire même le nom ... voici un échantillon de mon effort sans succès

 

$htmlContent = file_get_contents("orders.txt"); 

//print_r($htmlContent); 

$pattern = "/KKKKKKKKKKK(.*)\n/s"; 
preg_match_all($pattern, $htmlContent, $matches); 
print_r($matches); 
$name = $matches[1][0]; 
echo $name; 

+0

Est-ce réel des données? –

Répondre

4

Vous pouvez éviter regexes quelque chose comme ça. Puisque les données sont clairement organisées par ligne, vous pouvez lire plusieurs fois les lignes avec fgets() et analyser les données de cette façon.

+0

Appuyé. Cela ressemble plus à un travail pour 'fgets()' ou 'file()', puis en parcourant chaque ligne pour extraire les enregistrements individuels. –

0

Vous pouvez lire ce fichier avec regex, mais il peut être assez compliqué de créer une regex capable de lire tous les champs.

Je vous recommande de lire ce fichier ligne par ligne, et d'analyser chacun d'eux, en détectant le type de données qu'il contient.

0

Comme vous savez exactement où sont vos données (c'est-à-dire sur quelle ligne elles sont activées) pourquoi ne pas l'obtenir de cette façon?

-à-dire quelque chose comme

$htmlContent = file_get_contents("orders.txt"); 

$arrayofclients = explode("-----------------------",$htmlContent); 
$newlinesep = "\r\n"; 
for($i = 0;i < count($arrayofclients);$i++) 
{ 
$temp = explode($newlinesep,$arrayofclients[i]); 
$idnum = $temp[0]; 
$name = $temp[4]; 
$houseandstreet = $temp[6]; 
//etc 
} 

ou simplement lire la ligne de fichiers en ligne à l'aide fgets() - quelque chose comme:

$i = 0;$j = 0; 
$file = fopen("orders.txt","r"); 
$clients = []; 
while ($line = fgets($ffile)) 
{ 
    if(line != false) 
    { 
     $i++; 
     switch($i) 
     { 
     case 2: 
      $clients[$j]["idnum"] = $line; 
      break; 
     case 6: 
      $clients[$j]["name"] = $line; 
      break; 
     //add more cases here for each line up to: 
     case 18: 
      $j++; 
      $i = 0; 
      break; 
     //there are 18 lines per client if i counted right, so increment $j and reset $i. 
     } 
    } 
} 
fclose ($f); 

Vous pouvez utiliser regex, mais ils sont un peu gênant pour ce situation.

Nico

0

Pour mémoire, voici le regex qui saisira les noms pour vous. (Vitesse Accordée peut très bien être un problème.)

(?<=K{10}\s{2})\K[^\r\n]++(?!\s{2}-) 

Explication:

(?<=K{10}\s{2}) #Positive lookbehind for KKKKKKKKKK then 2 return/newline characters 
\K[^\r\n]++  #Greedily match 1 or more non-return/newline characters 
(?!\s{2}-)  #Negative lookahead for return/newline character then dash 

Voici un Regex Demo.

Vous remarquerez que mon modèle regex change légèrement entre la démo Regex et ma démo PHP. Une légère modification en fonction de l'environnement peut être nécessaire pour faire correspondre les caractères de retour/retour à la ligne.

Voici l'implémentation de php (Demo):

if(preg_match_all("/(?<=K{10}\s{2})\K[^\r\n]++(?!\s{2}-)/",$htmlContent,$matches)){ 
    var_export($matches[0]); 
}else{ 
    echo "no matches"; 
} 

En utilisant \K dans mon modèle que j'évite avoir à saisir avec des parenthèses. Cela réduit la taille des tableaux de 50% et constitue une astuce utile pour de nombreux projets. Le \K dit fondamentalement "démarrer la correspondance fullstring à partir de ce point", donc les correspondances vont dans le premier sous-tableau (fullstrings, key = 0) de $matches au lieu de générer une correspondance fullstring dans 0 et la capture dans 1.

Sortie:

array (
    0 => 'Laura Meyer', 
    1 => 'Venkat Talladivedula', 
)