wee493 Posted August 16, 2010 Share Posted August 16, 2010 I need some help parsing this text file. I've tried a few things, but had trouble as it's not actually json data. I've tried various str_replaces and things along those lines, but I would like to be able to output this into a table with the Steam id, time, name, and reason. If someone can just point me in the right direction i'd be fine coding myself! Thanks! "STEAM_0:0:18130940" { "admin" "(Console)" "unban" "1274151724" "time" "1273546924" "name" "-=SAS=- Death Master511" "reason" "Gcombat on spawn/Server Crash Attempts 1 week appeal at halania.com" } "STEAM_0:1:6428933" { "time" 1273619777 "unban" 1273706177 "admin" "TornadoChas3r(STEAM_0:0:19768725)" "name" ".:T.¥:. TRÅÑŒ (CRYSTAL)" "reason" "RDM/ 1 day Ban \"You had Enough Warnings\" / :" } Here's basically what I have right now, which does not work too well $myFile = "bans.txt"; $fh = fopen($myFile, 'r'); $theData = fread($fh, filesize($myFile)); fclose($fh); $rowsArr = explodeRows($theData); for($i=0;$i<count($rowsArr);$i++) { $lineDetails = explodeTabs($rowsArr[$i]); echo "<br>Steam ID: " . $lineDetails[0]; echo "<br>Surname : " . $lineDetails[1]; echo "<br>Tel Number : " . $lineDetails[2]; echo "<br><br>"; } function explodeRows($data) { $rowsArr = explode("\n", $data); return $rowsArr; } // Explode the columns according to tabs function explodeTabs($singleLine) { $tabsArr = explode("\t", $singleLine); return $tabsArr; } Quote Link to comment https://forums.phpfreaks.com/topic/210843-help-parsing-text-file/ Share on other sites More sharing options...
wildteen88 Posted August 16, 2010 Share Posted August 16, 2010 If each block, eg "STEAM_0:0:18130940" { "admin" "(Console)" "unban" "1274151724" "time" "1273546924" "name" "-=SAS=- Death Master511" "reason" "Gcombat on spawn/Server Crash Attempts 1 week appeal at halania.com" } is always going to occupy 8 lines. Then you could do something like this <?php function parseBans(&$dataArray) { $bans = array(); // split the array into chunks of 8 // this is because each block occupies 8 lines // Example block /* "STEAM_0:0:18130940" { "admin" "(Console)" "unban" "1274151724" "time" "1273546924" "name" "-=SAS=- Death Master511" "reason" "Gcombat on spawn/Server Crash Attempts 1 week appeal at halania.com" } */ $blocks = array_chunk($dataArray, ; // loop throught each ban block foreach($blocks as $block) { // get the steam id // matches "18130940" from "STEAM_0:0:18130940" preg_match('~[0-9]+)"~', $block[0], $m); $ban['steam_id'] = $m[1]; // remove the "STEAM_0:0:xxxxxxx"", "{" and "}" lines unset($block[0], $block[1], $block[7]); // implode the $block array back into a string $bits = implode($block); //This now leaves us with the following data /* "admin" "(Console)" "unban" "1274151724" "time" "1273546924" "name" "-=SAS=- Death Master511" "reason" "Gcombat on spawn/Server Crash Attempts 1 week appeal at halania.com" */ // parse the above into "key" "value" pairs preg_match_all('~"([a-z]+)"\s+"(.*?)"~', $bits, $pieces, PREG_SET_ORDER); foreach($pieces as $piece) { list(,$key, $value) = $piece; $ban[$key] = $value; } // add the $ban array into the $bans array $bans[] = $ban; } // return the $bans array return $bans; } // read the bans.txt file into an array. $arrayBans = file('bans.txt'); // run the function to parse the text file $bans = parseBans($arrayBans); ?> You'd parse the $bans array into a simple table using echo '<table border="1" cellpadding="10">'; echo '<tr><th>' . implode('</h><th>', array_map('ucwords', array_keys($bans[0]))) . '</th></tr>'; foreach($bans as $ban): echo '<tr><td>' . implode('</td><td>', $ban) . '</td></tr>'; endforeach; echo '</table>'; Quote Link to comment https://forums.phpfreaks.com/topic/210843-help-parsing-text-file/#findComment-1099939 Share on other sites More sharing options...
btherl Posted August 16, 2010 Share Posted August 16, 2010 One simple parsing structure is a loop like this: $results = array(); $current_result = null; foreach ($lineArr as $line) { if ($line == "}\n") { $results[] = $current_result; $current_result = null; } if (strpos($line, '"STEAM') === 0) { # Start of a new block $current_result['block_header'] = $line; } if (some condition to recognize a data line, like "admin" "(Console)") { # Parse the data line, and add a row like $current_result['admin'] = '(Console)' } } var_dump($results); That's a sketch of how it will work. It uses the "}" line as a marker to recognize when a block has finished, so it can add the results to the output array. Quote Link to comment https://forums.phpfreaks.com/topic/210843-help-parsing-text-file/#findComment-1100024 Share on other sites More sharing options...
sasa Posted August 17, 2010 Share Posted August 17, 2010 or <?php $test ='"STEAM_0:0:18130940" { "admin" "(Console)" "unban" "1274151724" "time" "1273546924" "name" "-=SAS=- Death Master511" "reason" "Gcombat on spawn/Server Crash Attempts 1 week appeal at halania.com" } "STEAM_0:1:6428933" { "time" 1273619777 "unban" 1273706177 "admin" "TornadoChas3r(STEAM_0:0:19768725)" "name" ".:T.¥:. TRÅÑŒ (CRYSTAL)" "reason" "RDM/ 1 day Ban \"You had Enough Warnings\" / :" } '; $test = preg_replace('/"(STEAM_[^"]+)"/', '[$1]', $test); $test = preg_replace('/\{|}/', '', $test); $test = preg_replace('/"([^"]+)"\t+([^ ])/S', '$1=$2', $test); $test = parse_ini_string($test, 1); print_r($test); ?> Quote Link to comment https://forums.phpfreaks.com/topic/210843-help-parsing-text-file/#findComment-1100162 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.