webForumDet fria alternativet

Plocka ut rätt information från en txt-fil

PHP

8 svar · 1 188 visningar · startad av lillebror

Medlem sedan apr. 20041 597 inlägg
Frågan#1

Jag håller på och utvecklar en databas och nu har jag väderdata som jag tänkte lägga in i databasen med hjälp av PHP. Denna data (METAR) kommer ursprungligen från Luftfartsverkets hemsida och uppdateras en gång varje halvtimme.

METAR används av luftfarten och talar om hur vädret är på en viss flygplats avseende vind, temperatur, lufttryck, molnbas etc. Det jag vill göra är att extrahera exempelvis den första posten som börjar med ESDF (Ronneby) och sedan spara all efterföljande information i en sträng tills ett "="-tecken påträffas. "="-tecknet talar om att METARN är slut och korrekt för den flygplatsen. Sedan vill jag att detta upprepas för alla efterföljande poster tills slutet på listan är nådd.

Någon som har några "hintar" eller om möjligt kan skicka mig vidare i rätt riktning? :)

METAR Sweden 

Information är aktuell 
 
Last updated Thu Mar 17 21:35:03 UTC 2005
 
ESDF 172120Z 27006KT 230V350 4700 BR SCT003 BKN008 OVC010 06/05 Q1007=
ESGG 172120Z 29005KT 0600 R03/0800V1100D R21/1400D FG VV002 04/03 
     Q1007 RWY 21 WET 51-100 PCT BA GOOD=
ESGJ 172120Z 35010KT 1500 R01/P1500N R19/P1500N -DZ VV002 02/02 Q1006 
     RWY 19 DAMP 51-100 PCT LESS THAN 1 MM BA70=
ESGT 172120Z 01009KT 9999 SCT022 SCT030 02/M00 Q1009=
ESGP 172120Z 35006KT 320V060 5000 BR BKN004 OVC009 04/4 Q1008=
ESKN 172120Z 34010KT 9999 OVC028 M01/M03 Q1006 RWY 08 WET 51-100 
     PCT 1 MM BA GOOD=
ESMK 172120Z AUTO 30016KT 3100 BR OVC006 08/07 Q1008=
ESMQ 172120Z AUTO 30007KT 9999 FEW015 OVC021 06/05 Q1005=
ESMS 172120Z 28015KT 8000 BR OVC006 08/07 Q1010 RWY 17 DAMP 51-100 
     PCT BA GOOD=
ESMT 172120Z AUTO 29011KT 5000 BR OVC002 05/05 Q1008=
ESMX 172120Z 26006KT 2000 BR BKN002 05/05 Q1006=
ESNG 171950Z 31004KT CAVOK M14/M17 Q1012=
ESNK 172050Z 35008KT 9999 FEW025 M08/M11 Q1009=
ESNN 172120Z 34006KT CAVOK M06/M09 Q1009 RWY 16 WET SNOW 51-100 PCT 
     BA51=
ESNO 172120Z 35009KT 9999 FEW022 SCT040 M08/M11 Q1007 REDZ=
ESNQ 172120Z 35007KT 5000 -SN BR FEW008 SCT015 BKN026 M13/M16 Q1012=
ESNS 172120Z 36010KT 9999 -SN SCT020 BKN027 M08/M12 Q1009=
ESNU 172120Z 35013KT 7000 SG SCT020 M07/M10 Q1008 1479/52=
ESNL 172050Z 34003KT 9999 SCT018 M11/M12 Q1010=
ESNY 172120Z AUTO 35009KT 4700 -SN SCT023 OVC035 M03/M05 Q1007=
ESNX 171920Z 36004KT 6000 -SN FEW008 BKN015 M11/M13 Q1008 RWY 12 
     BA 60=
ESOE 172120Z 35005KT 9999 BKN023 01/M02 Q1008=
ESOK 172120Z 34004KT 310V010 CAVOK 00/M02 Q1008=
ESOW 172120Z 34009KT 9999 BKN030 M01/M03 Q1007 RWY 01 WET 51-100 
     PCT 1 MM BA GOOD=
ESPA 172120Z 36007KT 330V030 9999 FEW015 SCT025 BKN038 M09/M12 Q1011=
ESPC 172120Z 03007KT 9999 BKN042 M07/M09 Q1009 RESN=
ESSA 172120Z 34015KT 9999 FEW011 BKN012 M02/M04 Q1005 RWY 01 ICE 
     0-10 PCT 1 MM BA66 RWY 08 ICE 0-10 PCT 1 MM BA69 RWY 01R ICE 
     0-10 PCT 1 MM BA65 TEMPO BKN015=
ESSB 172120Z AUTO 32013KT 9999 OVC013 M02/M05 Q1005 RWY 30 ICE 11-25 
     PCT BA65=
ESSD 172120Z 33009KT 9999 OVC031 M01/M05 Q1007=
ESSL 172120Z 02009KT 9999 -SG FEW008 OVC011 01/00 Q1007=
ESSP 172120Z 36006KT 9999 BKN015 00/M02 Q1007 RWY 27 WET 51-100 PCT 
     LESS THAN 1 MM BA78=
ESSV 172120Z 35012KT 9999 BKN012 01/00 Q1003 RWY 21 WET 51-100 PCT 
     BA GOOD=
ESTA 172120Z AUTO 27015KT 4500 BR OVC003 05/05 Q1009=
ESTL 172120Z AUTO 29021KT 7000 BR OVC006 08/07 Q1009=
ESUT 172120Z 00000KT 9999 FEW024 M21/M24 Q1010 BA GOOD=
Medlem sedan feb. 200563 inlägg
#2

Re: Plocka ut rätt information från en txt-fil

lillebror skrev:

Någon som har några "hintar" eller om möjligt kan skicka mig vidare i rätt riktning? :)

Du kan använda ett reguljärt uttryck. Om filen är liten så att du har läst in hela innehållet till en sträng så kan du använda preg_match_all.

Några fler länkar med info om reguljära uttryck med php:
http://se.php.net/regex
http://www.regular-expressions.info/php.html

/ Tomas

Medlem sedan apr. 20041 597 inlägg
#3

Tack för tipset...jag ska forska vidare lite så får jag återkomma med vad jag kommit fram till! :)

Medlem sedan apr. 20041 597 inlägg
#4

Mina hårstrån håller på att bli gråa av allt funderande! :) Jag försöker skapa ett reguljärt uttryck som splittar upp textmassan ovan till en vektor med innehållet ESDF 172120Z 27006KT 230V350 4700 BR SCT003 BKN008 OVC010 06/05 Q1007=. Det vill säga allt från de fyra stora bokstäverna till "="-tecknet. Någon som vet hur man skulle kunna skriva?

Medlem sedan sep. 200436 inlägg
#5

Fick det inte att fungera helt. Men om de första fyra bokstäverna alltid börjar med ES så fungerar det här.


$text = "ALL din METAR DATA";
preg_match_all("(ES[A-Z]{2}.*=)",$text,$hej);
$lol = $hej[0];

for($i=0;$i < count($lol); ++$i) {

echo($lol[$i]);
echo "<br /><br />";

}
Medlem sedan apr. 20041 597 inlägg
#6

Jag prövade uttrycket på en testsida och det fungerade bra. Dock skulle jag helst vilja att det fanns en begränsning att identifieraren (ex. ESFD) bara får innehålla fyra tecken samt att uttrycket även ska tillåta andra bokstäver ibörjan än bara ES... men det kanske är en senare fråga :) Tack ändå!

Medlem sedan apr. 20041 597 inlägg
#7

Jag använde mig av detta program för att testa att extrahera information med ovanstående uttryck. Jag förstår problematiken med att du endast fick ut de som började med ES eftersom låter man den plocka ut information med 4 stora bokstäver får man även med ord som "LESS" och "THAN".

Då tänkte jag så här. Kan man inte ange i uttrycket att ordet med 4 stora bokstäver som ska extraheras skall komma direkt efter ett "="-tecken. Då borde man väl få ut samtliga poster.

Nu räknade jag det till att jag hade fått ut ca 30 poster av totalt 38... :)

Mvh

Medlem sedan feb. 200563 inlägg
#8

Prova det här:

preg_match_all("/[\r\n]{1,2}([A-Z]{4}.+?)=/s",$text,$hej);

En liten förklaring:

"[\r\n]{1,2}" : matchar en radbrytning som kan vara \r , \n eller \r\n beroende på operativsystem

".+?=" : matchar ett eller flera tecken fram tills det första = tecknet. Tack vare "?" så matchas så få tecken som möjligt istället för så många som möjligt (då skulle nämligen allt t.o.m. det sista "=" hamna i en sträng).
Punkten matchar normalt inte radbrytningstecken men i detta fall gör den det p.g.a. ett "s" på slutet.
Jag förutsätter nämligen att du vill att t.ex. allt detta:

ESSP 172120Z 36006KT 9999 BKN015 00/M02 Q1007 RWY 27 WET 51-100 PCT 
     LESS THAN 1 MM BA78=

ska matchas till en enda sträng.

/ Tomas

Medlem sedan apr. 20041 597 inlägg
#9

Det fungerar precis så som jag ville ha det Tomas! :e Det är som en helt ny värld som öppnar sig när man kan använda sig av dessa strålande uttryck!

266 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)