我正在尝试读取结构化的日志文件,逐行爆炸,之后按冒号爆炸。
我正在尝试两种不同的方法fgets
和file_get_contents
,但在这两种方法中,我都只能达到一个或另一个目标(由或行爆炸)通过冒号)。
这里有代码:
<?php
// using fgets
$file = fopen('/var/www/html/PU1PAX.log', 'r');
while (!feof($file)) { // while not end of file
$content = fgets($file); // get file's content
$handle = explode(':', $content); // and explode by string
echo '<pre>';
print_r($handle);
echo '</pre>';
}
fclose($file);
// using file_get_contents
$file = '/var/www/html/PU1PAX.log';
$content = file_get_contents($file);
$handle = explode(PHP_EOL, $content);
echo '<pre>';
print_r ($handle);
echo '</pre>';
代码的第一部分在每一行上打印一个数组: 数组 ( [0] =>记录开始 [1] => 3.0 )
Array
(
[0] => LOCATION
[1] => DX
)
Array
(
[0] => CALLSIGN
[1] => PU1PAX
)
Array
(
[0] => CLUB
[1] =>
)
Array
(
[0] => CONTEST
[1] => CQRJVHF
)
第二部分仅打印一个数组,其中所有行都已排序:
Array
(
[0] => START-OF-LOG: 3.0
[1] => LOCATION: DX
[2] => CALLSIGN: PU1PAX
[3] => CLUB:
[4] => CONTEST: CQRJVHF
)
首先,我想找到一种解决方案,将所有这些数组组合在一起,因为内容或多或少地分离且可行。
对于第二个,如果我可以改变数组的方式来重新分解它(这次是冒号),将字符串的第一部分作为数组的键,第二部分作为数组的值如下例所示:
Array
(
[START-OF-LOG] => 3.0
[LOCATION] => DX
[CALLSIGN] => PU1PAX
[CLUB] =>
[CONTEST] => CQRJVHF
)
但是我完全被卡住了...:-(
答案 0 :(得分:1)
使用file()
函数逐行读取文件,然后可以展开每一行并填充关联数组:
$lines = file('/var/www/html/PU1PAX.log', FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
$data = [];
foreach ($lines as $line) {
@list($key, $value) = explode(':', $line, 2);
$data[$key] = trim($value);
}
print_r($data);
三件事:
explode()
的第三个参数将处理值也包含“:”字符的情况@
上使用了令人讨厌的list()
错误抑制来隐藏任何提示,如果行中不包含“:”字符。在这种情况下,trim($value)
将为您提供一个空字符串作为值FILE_IGNORE_NEW_LINES
标志的原因。 trim($value)
会将其删除,但是如果没有“:”字符,换行符将位于$key
中,因此最好不要将它们放在首位答案 1 :(得分:0)
也许您可以逐个字符地读fgetc()
$file=fopen("welcome.txt","r") or exit("Unable to open file!");
while ( !feof($file) ) {
$line = "";
do {
$c = fgetc($file);
$line .= $c;
} while ( (!feof($file) and $c != PHP_EOL )
// TODO: process $line (split in columns)
}
fclose($file);
P.s .:我没有测试此代码。只是一个主意。
答案 2 :(得分:0)
//$items = explode(PHP_EOL, $content); in your case
$items = ['START-OF-LOG:3.0','LOCATION:DX','CALLSIGN:PU1PAX','CLUB:','CONTEST:CQRJVHF'];
foreach($items as $item) {
$line = explode(':', $item); // and explode by string
$associtativeArray[$line[0]] = $line[1];
foreach($line as $line_item) {
$oneDimensionalArray[] = $line_item;
}
$groupedArray[] = $line;
}
print_r($associtativeArray);
print_r($oneDimensionalArray);
print_r($groupedArray);
这是打印结果: //这是$ associtativeArray 数组 ( [日志开始] => 3.0 [位置] => DX [CALLSIGN] => PU1PAX [CLUB] => [比赛] => CQRJVHF ) //这是$ oneDimensionalArray 数组 ( [0] =>记录开始 [1] => 3.0 [2] =>位置 [3] => DX [4] =>呼号 [5] => PU1PAX [6] =>俱乐部 [7] => [8] =>比赛 [9] => CQRJVHF ) //这是$ groupedArray 数组 ( [0] =>数组 ( [0] =>记录开始 [1] => 3.0 )
[1] => Array
(
[0] => LOCATION
[1] => DX
)
[2] => Array
(
[0] => CALLSIGN
[1] => PU1PAX
)
[3] => Array
(
[0] => CLUB
[1] =>
)
[4] => Array
(
[0] => CONTEST
[1] => CQRJVHF
)
)