У меня есть 100 файлов, каждый из которых содержит количество статей новостей. Статьи структурированы по разделам со следующими сокращениями:Как преобразовать структурированные текстовые файлы в многомерный массив PHP
HD BY WC PD SN SC PG LA CY LP TD CO IN NS RE IPC PUB AN
где [LP]
и [TD]
может содержать любое количество пунктов.
Типичным сообщений выглядит следующим образом:
HD Corporate News: Alcoa Earnings Soar; Outlook Stays Upbeat
BY By James R. Hagerty and Matthew Day
WC 421 words
PD 12 July 2011
SN The Wall Street Journal
SC J
PG B7
LA English
CY (Copyright (c) 2011, Dow Jones & Company, Inc.)
LP
Alcoa Inc.'s profit more than doubled in the second quarter, but the giant
aluminum producer managed only to meet analysts' recently lowered forecasts.
Alcoa serves as a bellwether for U.S. corporate earnings because it is the
first major company to report and draws demand from a wide range of
industries.
TD
The results marked an early test of how corporate optimism is holding up
in the face of bleak economic news.
License this article from Dow Jones Reprint
Service[http://www.djreprints.com/link/link.html?FACTIVA=wjco20110712000115]
CO
almam : ALCOA Inc
IN
i2245 : Aluminum | i22 : Primary Metals | i224 : Non-ferrous Metals | imet
: Metals/Mining
NS
c15 : Performance | c151 : Earnings | c1521 : Analyst
Comment/Recommendation | ccat : Corporate/Industrial News | c152 :
Earnings Projections | ncat : Content Types | nfact : Factiva Filters |
nfce : FC&E Exclusion Filter | nfcpin : FC&E Industry News Filter
RE
usa : United States | use : Northeast U.S. | uspa : Pennsylvania | namz :
North America
IPC
DJCS | EWR | BSC | NND | CNS | LMJ | TPT
PUB
Dow Jones & Company, Inc.
AN
Document J000000020110712e77c00035
После каждой статьи есть 4 строк до начала новой статьи. Мне нужно поставить эти статьи в массив следующим образом:
$articles = array(
[0] = array (
[HD] => Corporate News: Alcoa earnings Soar; Outlook...
[BY] => By James R. Hagerty...
...
[AN] => Document J000000020110712e77c00035
)
)
[edit]
Благодаря @Casimir и др Ипполит теперь у меня есть:
$path = "C:/path/to/textfiles/";
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if ('.' === $file) continue;
if ('..' === $file) continue;
$text = file_get_contents($path . $file);
$subjects = explode("\r\n\r\n\r\n\r\n", $text);
$pattern = <<<'LOD'
~
# definition
(?(DEFINE)(?<fieldname>(?<=^|\n)(?>HD|BY|WC|PD|SN|SC|PG|LA|CY|LP|TD|CO|IN|NS|RE|IPC|PUB|AN)))
# pattern
\G(?<key>\g<fieldname>)\s++(?<value>[^\n]++(?>\n{1,2}+(?!\g<fieldname>) [^\n]++)*+)(?>\n{1,3}|$)
~x
LOD;
$result = array();
foreach($subjects as $i => $subject) {
if (preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER)) {
foreach ($matches as $match) {
$result[$i][$match['key']] = $match['value'];
}
}
}
}
closedir($handle);
echo '<pre>';
print_r($result);
}
Однако никаких совпадений не были найдены, ни какие-либо ошибки производятся. Может кто-нибудь спросить меня, что здесь не так?
(http://mattgemmell.com/2008/ 12/08/what-have-you-try /) –