-1 votes

extraire plusieurs champs d'un fichier texte en utilisant php

Quel est le meilleur moyen d'extraire plusieurs (~40 valeurs) d'un fichier texte à l'aide de php ?

les données sont plus ou moins similaires :

NAMEA                   valuea
NAMEB                   valueb

Je cherche une approche appropriée* pour extraire ces données dans une structure de données, car je vais devoir spécifier des regex pour chacune d'entre elles (les 40).

Ai-je été clair ?

*C'est-à-dire que la méthode par défaut/douloureuse serait pour moi de le faire :

$namea = extractfunction("regexa", $textfilevalue);
$nameb = extractfunction("regeb", $textfilevalue);

... 40 fois !


Les lignes peuvent ne pas être dans le même ordre ou être présentes dans chaque fichier. Chaque NAMEA est un texte du type "Numéro d'enregistrement :", ou "Nom du demandeur :" (c'est-à-dire avec des espaces dans ce que j'appelais NAMEA).


Réponse au Col.

Je cherche une "façon" raisonnable d'écrire mon code, pour qu'il soit lisible, modifiable, qu'il construise un objet ou un tableau facilement appelable, etc... "bon style de codage !" :)


@Adam - En fait, ils le font... et contiennent aussi des barres obliques...


@Alix - Un homme extraordinaire ! C'était BIEN ! Aurais-tu aussi une idée sur la façon dont je peux "tronquer" le tableau des résultats en supprimant tout ce qui se trouve à partir de "key_x" ? Dois-je ouvrir une nouvelle question ?

1voto

Alix Axel Points 63455

Voici ce que j'en pense :

fichier.txt :

NAMEA                   valuea
NAMEB                   valueb

Code PHP :

$file = file_get_contents('./somefile.txt');
$string = preg_replace('~^(.+?)\s+(.+?)$~m', '$1=$2', $file);
$string = str_replace(array("\r\n", "\r", "\n"), '&', $string);

$result = array();

parse_str($string, $result);

echo '<pre>';
print_r($result);
echo '</pre>';

Sortie :

Array
(
    [NAMEA] => valuea
    [NAMEB] => valueb
)

Vous pouvez également simplifier davantage cette procédure en utilisant str_getcsv() sur PHP 5.3+.


EDIT : Ma version précédente échoue pour les clés qui ont des espaces comme l'a remarqué le Colonel Shrapnel. Je n'ai pas lu la question avec suffisamment d'attention. Une solution possible puisque vous semblez utiliser des clés qui ont toujours : est annexée :

$string = preg_replace('~^(.+?):\s+(.+?)$~m', '$1=$2', $file);

Pour tout supprimer de key_x à la fin du fichier, vous pouvez faire quelque chose comme ceci :

$string = substr($string, 0, strpos($string, 'key_x'));

L'ensemble se présente donc comme suit :

fichier.txt :

Registration Number:                   valuea
Applicant Name:                   valueb

Code PHP :

$file = file_get_contents('./somefile.txt');
$string = substr($file, 0, strpos($file, 'key_x'));
$string = preg_replace('~^(.+?):\s+(.+?)$~m', '$1=$2', $string);
$string = str_replace(array("\r\n", "\r", "\n"), '&', $string);

$result = array();

parse_str($string, $result);

echo '<pre>';
print_r($result);
echo '</pre>';

Sortie :

Array
(
    [Registration_Number] => valuea
    [Applicant_Name] => valueb
)

0voto

D'après ce que j'ai compris, vous pouvez utiliser file() pour obtenir un tableau de chaînes de caractères, puis analyser ces chaînes à l'aide d'une expression rationnelle.

si vous ajoutez un signe = entre les noms et les valeurs, vous pourrez obtenir l'ensemble en une seule fois en utilisant parse_ini_file()

0voto

Annika Backstrom Points 8138

En supposant que vos clés (namea, nameb) ne contiennent jamais d'espaces :

$contents = file('some_file.txt'); // read file as array
$data = array();
foreach($contents as $line) { // iterate over file
    preg_match('/^([^\s]+)\s+(.*)/', $line, $matches); // pull out key and value into $matches

    $key = $matches[1];
    $value = $matches[2];

    $data[$key] = $value; // store key/value pairs in $data array
}

var_dump($data); // what did we get?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X