如何将字符串从文件指针转换为表或数组

时间:2016-12-12 03:20:57

标签: php asterisk

我有一个问题是转换字符串响应fgets()...

响应是这样的......

Channel              Context              Extension        Prio State   Application  Data                      CallerID        Duration Accountcode PeerAccount BridgedTo           
Agent/2704           outgoing             901261499329974     1 Up      AppQueue     (Outgoing Line)           901261499329974 00:02:28                         SIP/pbx-load-balance
SIP/135-00005571     outgoing             90116567011298     17 Up      Dial         SIP/pbx-load-balancer/901 61290371819     00:17:40                         SIP/pbx-load-balance
SIP/140-00005744     outgoing             90116562654777     17 Up      Dial         SIP/pbx-load-balancer/901 8884317666      00:00:03                         (None)              
SIP/144-00005741     outgoing             90116563334544     17 Up      Dial         SIP/pbx-load-balancer/901 8884317666      00:00:17                         SIP/pbx-load-balance
SIP/pbx-load-balance outgoing                                 1 Up      AppDial      (Outgoing Line)           90116567011298  00:17:40                         SIP/135-00005571    
SIP/200-00005730     outgoing             901161384201116    17 Up      Dial         SIP/pbx-load-balancer/901 8884317666      00:01:28                         SIP/pbx-load-balance

如何将其格式化为表格或至少格式化为数组格式...

谁来自这里?..非常感谢你!非常感谢!!!

1 个答案:

答案 0 :(得分:1)

它类似于csv文件,但是,似乎出现了多个空格。标题行似乎没有空格的字段名称。那么让我们找到场位置并计算场长。然后创建一个正则表达式,它只按长度获取字段。最后,我们修剪字段,删除不需要的空格。

$csv = <<< '_END_'
Channel              Context              Extension        Prio State   Application  Data                      CallerID        Duration Accountcode PeerAccount BridgedTo           
Agent/2704           outgoing             901261499329974     1 Up      AppQueue     (Outgoing Line)           901261499329974 00:02:28                         SIP/pbx-load-balance
SIP/135-00005571     outgoing             90116567011298     17 Up      Dial         SIP/pbx-load-balancer/901 61290371819     00:17:40                         SIP/pbx-load-balance
SIP/140-00005744     outgoing             90116562654777     17 Up      Dial         SIP/pbx-load-balancer/901 8884317666      00:00:03                         (None)              
SIP/144-00005741     outgoing             90116563334544     17 Up      Dial         SIP/pbx-load-balancer/901 8884317666      00:00:17                         SIP/pbx-load-balance
SIP/pbx-load-balance outgoing                                 1 Up      AppDial      (Outgoing Line)           90116567011298  00:17:40                         SIP/135-00005571    
SIP/200-00005730     outgoing             901161384201116    17 Up      Dial         SIP/pbx-load-balancer/901 8884317666      00:01:28                         SIP/pbx-load-balance
_END_;

$lines = preg_split('~\r?\n~', $csv);


// word begin/end with no space behind (=word begin only)
preg_match_all('~\b(?>[^\s])~', $lines[0], $pos_fields, PREG_OFFSET_CAPTURE);
$pos_fields=$pos_fields[0];

$regexp = '';
$pos = $pos_fields[0][1];

// (.{10}) for a field width 10
for($i = 1; $i < count($pos_fields); $i++)
  $regexp .= '(.{' . ($pos_fields[$i][1] - $pos_fields[$i - 1][1]) . '})';

$regexp = "/$regexp(.*)/";
$arr = [];

for($i = 0; $i < count($lines); $i++)
{
  preg_match($regexp, $lines[$i], $line);
  array_shift($line);
  array_walk($line, function(&$val, $k)  { $val= $arr[$k] = chop($val); });
  $arr[] = $line;
}

var_dump($arr);