2017-01-23 1 views
0

ab Ich versuche, einen Wert aus der gleichen 'Spalte' in einer Textdatei von einer Website zu erhalten, die sich täglich ändert. Ich habe Schwierigkeiten, da die Werte nicht jeden Tag an den gleichen Orten sind und manchmal ein Wert vorhanden ist und manchmal nicht.So rufen Sie den gleichen Wert aus einer sich dynamisch ändernden Textdatei mit Hilfe von PHP

Zum Beispiel, ich bin nach dem Wert in '12hMx', Tag 1, es ist:

 mean high low Total 12hMx Max Temp Anom      
03002      10.6 13.4 6.8    Baltasound 

am Tag 2, es ist:

 mean high low Total 12hMx Max Temp Anom      
03002   14.5    12.8 7.5    Baltasound 

am Tag 3, es ist:

 mean high low Total 12hMx Max Temp Anom      
03002      10.1   5.5    Baltasound 

Ich benutze PHP file_get_contents() und dann explode(), um die Werte zwischen 03002 und Baltasound zu bekommen, aber offensichtlich ändern sie Tag an Tag.

Gibt es einen sicheren Weg, um immer den Wert für 12hMx unabhängig von den davor liegenden Werten zu erhalten?

Mein aktueller Code, der inkonsistent ist:

$forecastPage = file_get_contents("http://www.met.reading.ac.uk/~brugge/CURR.html"); 
      $pageArray = explode('Little Rissington', $forecastPage, 8); 

    if (sizeof($pageArray) > 1) { 

      $secondPageArray = explode('03658', $pageArray[1]); 

          if (sizeof($secondPageArray) > 1) { 

       $weather = $secondPageArray[0]; 
       $lessWeather = explode(' ',$weather); 
       $wetness = $lessWeather[43]; 
       $totalrain = $lessWeather[10]; 
       $totalsun = $lessWeather[46]; 

"Little Rissington" und "03658" sind die Textelemente unmittelbar vor und nach der Zeile in Ich bin interessiert

+0

Wie sind die Spalten begrenzt? Tabs? Und wenn Sie Ihren bestehenden Code zeigen, wird es einfacher, Verarbeitungsfehler zu erkennen. – ADyson

+0

Das Trennzeichen scheint Leerzeichen zu sein (Leerzeichen) –

+0

nun, ist der 12hMx-Wert (oder der Speicherplatz, wo es sein würde) immer die gleiche Anzahl von Zeichen vom Anfang der Zeile? Wenn ja, können Sie es leicht abrufen. Wenn nicht, wird es sehr schwierig werden. – ADyson

Antwort

1

Ok, so. Ich habe gerade darüber nachgedacht, während die Header in der Konsolenausgabe gleich bleiben. Ich denke, diese Methode würde funktionieren. Nebenbei bemerkt, das ist nur ein Beweis des Konzepts, es ist nicht optimiert und sicherlich nicht optimal. Sie müssen es überprüfen, bevor Sie es in der Produktion verwenden. Auch nicht gesichert ist, nicht für UTF-8-Unterstützung usw. getan ... Halten Sie es im Auge;)

So ist der Code ist folgende:

$consoleOuput = '  mean high low Total 12hMx Max Temp Anom      
03002      10.6 13.4 6.8    Baltasound'; 

/*$consoleOuput = '  mean high low Total 12hMx Max Temp Anom 
03002   14.5    12.8 7.5    Baltasound';*/ 

/*$consoleOuput = '  mean high low Total 12hMx Max Temp Anom 
03002      10.1   5.5    Baltasound';*/ 

list($headers, $data) = explode(PHP_EOL, $consoleOuput); 

$meanPos = array(0      , strpos($headers, 'high')); 
$highPos = array(strpos($headers, 'high'), strpos($headers, 'low' )); 
$lowPos = array(strpos($headers, 'low' ), strpos($headers, 'Total')); 
$totalPos = array(strpos($headers, 'Total'), strpos($headers, '12hMx')); 
$hMxPos = array(strpos($headers, '12hMx'), strpos($headers, 'Max' )); 
$maxPos = array(strpos($headers, 'Max' ), strpos($headers, 'Temp')); 
$tempPos = array(strpos($headers, 'Temp'), strpos($headers, 'Anom')); 
$anomPos = array(strpos($headers, 'Anom'), strlen($headers  )); 


$get = function($pos) use ($data) 
{ 
    list($start, $stop) = $pos; 

    $res = substr($data, $start, $stop - $start); 

    $res = trim($res); 

    return $res; 
}; 

$mean = $get($meanPos); 
$high = $get($highPos); 
$low = $get($lowPos); 
$total = $get($totalPos); 
$hMx = $get($hMxPos); 
$max = $get($maxPos); 
$temp = $get($tempPos); 
$anom = $get($anomPos); 

$res = array(
    'mean' => $mean, 
    'high' => $high, 
    'low' => $low, 
    'Total' => $total, 
    '12hMx' => $hMx, 
    'Max' => $max, 
    'Temp' => $temp, 
    'Anom' => $anom, 
); 

print_r($res); 

Sie können sehen, ich beginne mit explodier die Daten in vars: $headers und $data.

Dann finde ich Anfang und Ende jeder Spalte in der Kopfzeile. Und dann verwenden Sie es, um Text in der Datenzeile zu sammeln. Dann lege ich es einfach in Array. Die Tow-Schritte können zusammengeführt werden, aber gut, ich war mir der Ausgabe nicht sicher, die ich vor der Kodierung bekommen möchte ..: p

Ich bin für jede Frage dazu.

Hoffe es half :)

+0

Vielen Dank. Ich habe das ausgeführt und folgendes bekommen: Array ([mittel] => 03002 [hoch] => [niedrig] => [Gesamt] => 10.6 [12hMx] => 13.4 [Max] => 6.8 [Temp] => [ Anom] =>). Also funktioniert das Konzept ... Ich werde es durchgehen und versuchen, es zu verstehen und irgendwelche Verbesserungen vorzunehmen. –

+0

Nun, während Ihre Spaltenüberschriften eine definierte Breite haben (was vom Anfang des Wortes ist, das sie in den meisten Fällen zum Anfang der nächsten Spalte definiert), können Sie einfach diese Größen erhalten und dann die nächste Zeile mit den Größen ausschneiden, die wird dir das richtige Array geben :) – Bobot

Verwandte Themen