How to parse fixed width column text in php?
How to parse and display below text in php and output it in hmtl?
What I need is a hint how to approach the spaces that separates the columns. The number of spaces is not fixed so I cannot use explode(" ",$string);
And also I am not sure if the structure of below output has really fixed width columns. I want to make the parsing function generic.
The output comes from db2 list applications
Auth Id Application Appl. Application Id DB # of
Name Handle Name Agents
-------- -------------- ---------- -------------------------------------------------------------- -------- -----
DB2INST1 db2jcc_applica 11446 10.0.0.209.51406.120606004531 WEI 1
DB2INST1 db2jcc_applica 11448 10.0.0.209.51407.120606004536 WEI 1
DB2INST1 db2jcc_applica 13762 10.0.0.206.57473.120606024909 DOM_BUGS 1
ADMIN db2jcc_applica 15220 10.0.0.210.52248.120606045402 RATIONAL 1
DB2INST1 php-fpm: pool 16546 127.0.0.2.35530.120606065726 KON 1
DB2INST1 db2jcc_applica 16547 10.0.0.202.52042.120606065813 KON 1
First of all, there was sscanf
:
$vars = sscanf($string, '%s %s %d %s');
It is optimized for whitespace separated values, and you can specify the variable type already (%s
= string; %d
= integer)(; even name the variables but that is not demonstrated in the example).
Example/Demo:
$lines = explode("\r\n", $input);
foreach($lines as &$line)
{
$line = sscanf($line, '%s %s %d %s');
}
var_dump($lines);
Output:
array(6) {
[0]=>
array(4) {
[0]=>
string(8) "DB2INST1"
[1]=>
string(14) "db2jcc_applica"
[2]=>
int(11446)
[3]=>
string(29) "10.0.0.209.51406.120606004531"
}
[1]=>
array(4) {
[0]=>
string(8) "DB2INST1"
[1]=>
string(14) "db2jcc_applica"
[2]=>
int(11448)
[3]=>
string(29) "10.0.0.209.51407.120606004536"
}
[2]=>
array(4) {
[0]=>
string(8) "DB2INST1"
[1]=>
string(14) "db2jcc_applica"
[2]=>
int(13762)
[3]=>
string(29) "10.0.0.206.57473.120606024909"
}
[3]=>
array(4) {
[0]=>
string(5) "ADMIN"
[1]=>
string(14) "db2jcc_applica"
[2]=>
int(15220)
[3]=>
string(29) "10.0.0.210.52248.120606045402"
}
[4]=>
array(4) {
[0]=>
string(8) "DB2INST1"
[1]=>
string(8) "php-fpm:"
[2]=>
NULL
[3]=>
NULL
}
[5]=>
&array(4) {
[0]=>
string(8) "DB2INST1"
[1]=>
string(14) "db2jcc_applica"
[2]=>
int(16547)
[3]=>
string(29) "10.0.0.202.52042.120606065813"
}
}
You can preg_split by space
$words = preg_split("/[\s]+/", $input);
//if your lines seperated by `\n` new line you could:
$inputArr = preg_split("/\R+/", $input);
foreach($inputArr as $value) {
$out = preg_split("/\s+/", $value);
var_dump($out);
}
Thanks
You could use preg_match
on each data line as such:
preg_match('~^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$~', $line, &$matches);
This would return 1
if matched, 0
if not.
And - more importantly - the column content in $matches
, like the following:
array (
0 => 'DB2INST1 db2jcc_applica 11446 10.0.0.209.51406.120606004531',
1 => 'DB2INST1',
2 => 'db2jcc_applica',
3 => '11446',
4 => '10.0.0.209.51406.120606004531',
)
The pattern simply matches sequences of non-whitespace separated by sequences of whitespace. So as long as there is no whitespace as part of the data itself, this should work on any random column length.