开发者

extracting multiple fields from a text file using php

what is the best way of extracting multiple (~40 values) from a text file using php?

the data is more or less like:

NAMEA                   valuea
NAMEB                   valueb

I'm looking for a proper* approach to extracting this data into a data-structu开发者_如何学运维re, because i will need to specify regexs for all of them (all 40).

did i make myself clear?

*meaning, the default/painful method would be for me to do:

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

... 40 times!


The lines may not be in the same order, or be present in each file. Every NAMEA is text like: "Registration Number:", or "Applicant Name:" (ie, with spaces in what i was calling as NAMEA)


Response to the Col.

i'm looking for a sensible "way" of writing my code, so its readable, modifiable, builds an object/array thats easily callable, etc... "good coding style!" :)


@Adam - They do actually... and contain slashes as well...


@Alix - Freaking marvelous man! THat was GOOD! would you also happen to have any insights on how I can "truncate" the rsultant array by removing everything from "key_x" and beyond? Should i open that as a new question?


Here is my take at it:

somefile.txt:

NAMEA                   valuea
NAMEB                   valueb

PHP Code:

$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>';

Output:

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

You may also be able to further simplify this by using str_getcsv() on PHP 5.3+.


EDIT: My previous version fails for keys that have spaces like @Col. Shrapnel noticed. I didn't read the question with enough attention. A possible solution since you seem to be using keys that always have : appended is this:

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

To remove everything from key_x to the end of the file you can do something like this:

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

So the whole thing would look like this:

somefile.txt:

Registration Number:                   valuea
Applicant Name:                   valueb

PHP Code:

$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>';

Output:

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


as far as I get it you can use file() to get an array of strings and then parse these strings with some regexp.

if you add a = sign between names and values, you'll be ble to get the whole thing at once using parse_ini_file()


Assuming your keys (namea, nameb) never have spaces in them:

$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?
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜