//A string inicial
$data = "Titulo Valor Desc
item1 10 Descrição aqui
novo aqui AB Mensagem
Label text_1 Descrição...";
//Divide a string pelas quebras de linha
$rows = explode("\n", $data);
//Array com o cabeçalho
$header = array_map(
//Executa a função trim em todas as string resultantes
"trim",
//Divide por dois espaços
explode(
" ",
//Pega a primeira linha (isso já remove ela do array "$rows")
array_shift($rows)
)
);
//Cria uma variável para guardar os dados organizados
$parsed = array();
//Percorre as linhas
foreach ($rows as $row) {
$row = array_map(
//Executa a função trim em todas as string resultantes
"trim",
//Filtra o array para remover índices em branco
array_filter(
//Divide por dois espaços
explode(" ", $row),
function($v) {
return $v !== "";
}
)
);
//Cria um novo array a partir de dois,
//o primeiro será usado para os índices
//e o segundo para os valores
$parsed[] = array_combine($header, $row);
}
//Mostra o resultado
print_r($parsed);
The result of print_r
:
Array
(
[0] => Array
(
[Titulo] => item1
[Valor] => 10
[Desc] => Descrição aqui
)
[1] => Array
(
[Titulo] => novo aqui
[Valor] => AB
[Desc] => Mensagem
)
[2] => Array
(
[Titulo] => Label
[Valor] => text_1
[Desc] => Descrição...
)
)
As you can see there is no need for regular expressions
The function trim
is executed to remove possible mirrors after and before the column, for example, " text_1 "
flipped "text_1"
The function array_filter
is executed to remove possible empty indices, for example, ["Label", "", "", "text_1", "Descrição..."]
flipped ["Label", "text_1", "Descrição..."]
If you want to use regular expressions...
$data = "Titulo Valor Desc
item1 0 Descrição aqui
novo aqui AB Mensagem
Label text_1 Descrição...";
$rows = explode("\n", $data);
$header = preg_split(
"/\s{2,}/",
trim(
array_shift($rows)
)
);
$parsed = array();
foreach ($rows as $row) {
$parsed[] = array_combine(
$header,
preg_split(
"/\s{2,}/",
$row
)
);
}
print_r($parsed);
The idea is more or less the same, except that the preg_split
already does the job of explode
, array_filter
and array_map
+ trim
. The end result is the same
Are you sure the file is blank space? If they are spaces, which should happen if any value has 2 or more spaces in a row, something like
"Anderson Woss"
? It’s just a value.– Woss
Yeah, I’m sure they’re blanks. Values when inserted cannot contain multiple blank spaces between characters, but for some reason they can contain infinite spaces on the right. However, before each new column there will always be 2 blanks.
– Fábio Jânio