извлечение нескольких полей из текстового файла с использованием php - PullRequest
0 голосов
/ 16 мая 2010

Каков наилучший способ извлечения нескольких (~ 40 значений) из текстового файла с использованием php?

данные более или менее похожи на:

NAMEA                   valuea
NAMEB                   valueb

Я ищу правильный * подход к извлечению этих данных в структуру данных, потому что мне нужно будет указать регулярные выражения для всех из них (все 40).

я ясно дал понять?

* означает, что по умолчанию / болезненный метод будет для меня сделать:

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

... 40 раз!


Строки могут быть не в том же порядке или присутствовать в каждом файле. Каждый текст NAMEA имеет вид: «Регистрационный номер:» или «Имя заявителя» (т. Е. С пробелами в том, что я называл NAMEA)


Ответ полковнику.

Я ищу разумный «способ» написания моего кода, чтобы он был читабельным, изменяемым, создавал объект / массив, который можно было легко вызывать и т. Д… :)


@ Адам - ​​Они действительно ... и также содержат косые черты ...


@ Аликс - Чудовищный человек! Это было хорошо! у вас также есть какие-то идеи о том, как я могу "усечь" массив rsultant, удалив все из "key_x" и далее? Должен ли я открыть это как новый вопрос?

Ответы [ 3 ]

1 голос
/ 16 мая 2010

Вот мое мнение:

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

Выход:

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

Вы также можете еще больше упростить это, используя str_getcsv() на PHP 5.3 +.


EDIT : Моя предыдущая версия не работает для ключей с пробелами типа @Col. Шрапнель заметил. Я не читал вопрос с достаточным вниманием. Возможное решение, поскольку вы, похоже, используете ключи, к которым всегда добавляется :, таково:

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

Чтобы удалить все с key_x до конца файла, вы можете сделать что-то вроде этого:

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

Так что все это будет выглядеть так:

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

Выход:

Array
(
    [Registration_Number] => valuea
    [Applicant_Name] => valueb
)
0 голосов
/ 16 мая 2010

Предполагая, что ваши ключи (namea, nameb) никогда не содержат пробелов:

$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 голосов
/ 16 мая 2010

Насколько я понимаю, вы можете использовать file (), чтобы получить массив строк, а затем проанализировать эти строки с некоторым регулярным выражением.

если вы добавите знак = между именами и значениями, вы получите все сразу, используя parse_ini_file ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...