This is what I came up with.
Please note the comments in the code and also note that I supposed your example file was changed when posted here (tabs to spaces).
If you have a set number of spaces as separators this gets more difficult since we may have the same set of empty spaces inside a field (eg. Book name). This could make the script not run as expected. You can change "\t"
to " "
(four spaces) if that is what you have, you need to test the file/string to know.
Tabs are fine, but you can't have tabs inside any text fields as well or this will fail.
Because the tabs are being changed for spaces here, I hardcoded them as \t
in the code below.
<?php
# This is basically just exploding the elements 2 times
# and getting the elements in the right order
# This will hold the array with info
$finalResult = array();
# Your input text to be parsed
# I am supposing you have TABS as delimiters and the order never changes
$inputText = <<<EOF
The Boys in the Boat\tDaniel James Brown\t067002581X\t19.99\t5\t16.99\t9\t16.99
Harry Potter and the Cursed Child\tJ. K. Rowling, Jack Thorne, John Tiffany\t1338099133\t18.95\t25\t17.98\t0\t17.98
Just Mercy\tBryan Stevenson\t0812994520\t17.50\t8\t16.25\t10\t16.25
Me Before You\tJojo Moyes\t0670026603\t18.95\t2\t17.50\t1\t17.25
A Thousand Splendid Suns\tKhaled Hosseini\t1594489505\t19.00\t7\t15.50\t4\t14.95
The Wright Brothers\tDavid McCullough\t1476728742\t21.95\t3\t18.95\t3\t18.95
EOF;
# First break each line into array of lines
# If you are sure this file comes from *nix you can use
as newline
# If you are sure this comes from Windows you can use
# Or you can use PHP_EOL but this use the current system as a basis for what to use
$textLines = explode("
", $inputText);
# Now we go through each line getting all data
foreach($textLines as $line) {
# Get each tab-separated field
$expLine = explode("\t", $line);
# Sanity check
if (count($expLine) < 8) {
# The line does not have enough items, deal with error
echo "Item " . (isset($expLine[0]) ? $expLine[0]." " : "") . "ignored because of errors
";
continue;
}
# new item
# I have changed this a bit as it seems you have more fields to get than
# what shows on your example (2 quantities, for hard and softcovers)
$finalResult[$expLine[0]] = array(
"author" => $expLine[1],
"isbn" => $expLine[2],
"hardcover" => $expLine[3],
"hc-quantity" => $expLine[4],
"softcover" => $expLine[5],
"sc-quantity" => $expLine[6],
"e-book" => $expLine[7],
);
}
# Just show the data structure
var_dump($finalResult);
?>
And then the result:
array(6) {
["The Boys in the Boat"]=>
array(7) {
["author"]=>
string(18) "Daniel James Brown"
["isbn"]=>
string(10) "067002581X"
["hardcover"]=>
string(5) "19.99"
["hc-quantity"]=>
string(1) "5"
["softcover"]=>
string(5) "16.99"
["sc-quantity"]=>
string(1) "9"
["e-book"]=>
string(5) "16.99"
}
["Harry Potter and the Cursed Child"]=>
array(7) {
["author"]=>
string(40) "J. K. Rowling, Jack Thorne, John Tiffany"
["isbn"]=>
string(10) "1338099133"
["hardcover"]=>
string(5) "18.95"
["hc-quantity"]=>
string(2) "25"
["softcover"]=>
string(5) "17.98"
["sc-quantity"]=>
string(1) "0"
["e-book"]=>
string(5) "17.98"
}
["Just Mercy"]=>
array(7) {
["author"]=>
string(15) "Bryan Stevenson"
["isbn"]=>
string(10) "0812994520"
["hardcover"]=>
string(5) "17.50"
["hc-quantity"]=>
string(1) "8"
["softcover"]=>
string(5) "16.25"
["sc-quantity"]=>
string(2) "10"
["e-book"]=>
string(5) "16.25"
}
["Me Before You"]=>
array(7) {
["author"]=>
string(10) "Jojo Moyes"
["isbn"]=>
string(10) "0670026603"
["hardcover"]=>
string(5) "18.95"
["hc-quantity"]=>
string(1) "2"
["softcover"]=>
string(5) "17.50"
["sc-quantity"]=>
string(1) "1"
["e-book"]=>
string(5) "17.25"
}
["A Thousand Splendid Suns"]=>
array(7) {
["author"]=>
string(15) "Khaled Hosseini"
["isbn"]=>
string(10) "1594489505"
["hardcover"]=>
string(5) "19.00"
["hc-quantity"]=>
string(1) "7"
["softcover"]=>
string(5) "15.50"
["sc-quantity"]=>
string(1) "4"
["e-book"]=>
string(5) "14.95"
}
["The Wright Brothers"]=>
array(7) {
["author"]=>
string(16) "David McCullough"
["isbn"]=>
string(10) "1476728742"
["hardcover"]=>
string(5) "21.95"
["hc-quantity"]=>
string(1) "3"
["softcover"]=>
string(5) "18.95"
["sc-quantity"]=>
string(1) "3"
["e-book"]=>
string(5) "18.95"
}
}