如何将文件指针中的字符串转置为 table 或数组

How to transpose string from a file pointer into table or Array

我在转置字符串响应 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

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

这里有人吗?..非常感谢!!非常感谢!!!

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

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