webForumDet fria alternativet

Plocka ut data

7 svar · 410 visningar · startad av Sabotnick

SabotnickMedlem sedan feb. 200377 inlägg
#1

Hej,

Sitter här och försöker söka igenom forum men hittar inget. Hur kan man plocka isär data som ser ut så här:

----------------------------------------------------------------------
starttid \n aktivitet \n plats \n sluttid
starttid \n aktivitet \n plats \n sluttid
starttid \n aktivitet \n plats \n sluttid
starttid \n aktivitet \n plats \n sluttid
starttid \n aktivitet \n plats \n sluttid
----------------------------------------------------------------------

Skriver jag myArray[1][2] så får jag ut från andra raden vad det är för aktivitet.

Jag har provat med detta: preg_match("/(.*?)\n(.*?)\n(.*?)\n(.*?)/is", DATA, $match); man kan inte få saker ut från andra raden bara första.

Den riktiga filen jag jobbar med ser ut så här typ:
----------------------------------------------------------------------
.
.
.
BEGIN:VEVENT
DTSTART;TZID=Europe/Stockholm:20060123T100000
DTEND;TZID=Europe/Stockholm:20060123T120000
UID:20060123T213155-242640@timeedit.evolvera.se
DTSTAMP:20060103T145248Z
SUMMARY:EI2\, IT2\nAng_10134\nDjordjevich\, Marko\nFöreläsning\nOrdinära differentialekvationer
END:VEVENT
BEGIN:VEVENT
DTSTART;TZID=Europe/Stockholm:20060123T130000
DTEND;TZID=Europe/Stockholm:20060123T150000
UID:20060123T213155-236860@timeedit.evolvera.se
DTSTAMP:20051220T103238Z
SUMMARY:EI2\, IT2\nAng_4101\nDjordjevich\, Marko\nFöreläsning\nOrdinära differentialekvationer
END:VEVENT";
.
.
.
----------------------------------------------------------------------

MatteMedlem sedan aug. 20002 975 inlägg
#2

Vilken som är starttid, sluttid och plats förstår jag.
Dock är frågan om de bägge TZID alltid är desamma, och om inte, vilken gäller ?

Vilken del är det som ska tas ut som aktivitet ?

SabotnickMedlem sedan feb. 200377 inlägg
#3

Om vi kollar på detta:
-----------------------------------------------------------------------------
BEGIN:VEVENT
DTSTART;TZID=Europe/Stockholm:20060123T100000
DTEND;TZID=Europe/Stockholm:20060123T120000
UID:20060123T213155-242640@timeedit.evolvera.se
DTSTAMP:20060103T145248Z
SUMMARY:EI2\, IT2\nAng_10134\nDjordjevich\, Marko\nFöreläsning\nOrdinära differentialekvationer
END:VEVENT
-----------------------------------------------------------------------------

så vill jag ha ut detta:

myArray[0][0] = 20060123 //Startdatum
myArray[0][1] = 100000 //starttid
myArray[0][2] = 20060123 //Slutdatum
myArray[0][3] = 120000 //Sluttid
myArray[0][4] = EI2\, IT2 //Klasser
myArray[0][5] = Ang_10134 //Plats
myArray[0][6] = Djordjevich\, Marko //Föreläsare
myArray[0][7] = Föreläsning //Typ av aktivitet
myArray[0][8] = Ordinära differentialekvationer //Kurs

Är tacksam om ni kan hjälpa mig.

aasahMedlem sedan mars 20034 471 inlägg
#4

Sabotnick skrev:

Hur kan man plocka isär data som ser ut så här:

----------------------------------------------------------------------
starttid \n aktivitet \n plats \n sluttid
starttid \n aktivitet \n plats \n sluttid
starttid \n aktivitet \n plats \n sluttid
starttid \n aktivitet \n plats \n sluttid
starttid \n aktivitet \n plats \n sluttid
----------------------------------------------------------------------

....

Jag har provat med detta: preg_match("/(.*?)\n(.*?)\n(.*?)\n(.*?)/is", DATA, $match); man kan inte få saker ut från andra raden bara första.
...

Om du vill matcha hela strängen på det sättet ska du använda preg_match_all inte preg_match. Den senare matchar bara en gång.

Men... Om du vill dela upp strängen och "\n" skiljer alla fält, varför använder du inte explode istället?

MatteMedlem sedan aug. 20002 975 inlägg
#5

Testa detta:

// $content är filinnehållet

$pattern = "/DTSTART;TZID=(.*?):(\d+)T(\d+)\s*DTEND;TZID=.*?:(\d+)T(\d+).*?SUMMARY:(.*?)\n/is";
preg_match_all($pattern, $content, $matches);

$myArray = array();
for ($i=0; $i<count($matches[0]); $i++) {
   $time = array(
      $matches[2][$i], 
      $matches[3][$i],
      $matches[4][$i],
      $matches[5][$i]
   );
   $event = explode('\n', $matches[6][$i]);
   $place = array($matches[1][$i]);

   $myArray[] = array_merge($time, $event, $place);
}

// Och så en utskrift för att se vad vi hämtar
echo "<pre>";
print_r($myArray);
echo "</pre>";

Regexpet ovan förvanskas när jag lägger in det i forumet. Lyckas inte på något sätt få det att visas rätt, så jag bifogar som fil dessutom.

SabotnickMedlem sedan feb. 200377 inlägg
#6

Tusen tack Matte för att du försöker hjälpa mig.

Men när jag kör koden så får jag bara detta ut
"Array
(
)" hmmm

Känns som for-loopen inte körs.

MatteMedlem sedan aug. 20002 975 inlägg
#7

Använd koden i den bifogade filen istället. Koden som visas i forumet förvaskas av forumet.

Hur hämtar du filinnehållet ?

SabotnickMedlem sedan feb. 200377 inlägg
#8

Tack jag fick allt att fungera nu. så här ser koden ut

<?php /* Created on: 2006-01-30 */
$content = file_get_contents("http://schema.angstrom.uu.se/4DACTION/iCal_downloadReservations/timeedit.ics?from=603&to=612&id1=3061000&branch=2&lang=1");
$content = preg_replace ( "/\ä/is", "ä", $content );
$content = preg_replace ( "/\Ã¥/is", "å", $content );
$content = preg_replace ( "/\ö/is", "ö", $content );
$content = preg_replace ( "/\\\,/is", ",", $content );
$content = preg_replace ( "/\\\r\\n /is", "", $content );

$pattern = "/DTSTART;TZID=(.*?):(\d+)T(\d+)\s*DTEND;TZID=.*?:(\d+)T(\d+).*?SUMMARY:(.*?)\n/is";
preg_match_all($pattern, $content, $matches);

$myArray = array();
for ($i=0; $i<count($matches[0]); $i++) {
$time = array(
$matches[2][$i],
$matches[3][$i],
$matches[4][$i],
$matches[5][$i]
);
$event = explode('\n', $matches[6][$i]);
$place = array($matches[1][$i]);

$myArray[] = array_merge($time, $event, $place);
}
// Och så en utskrift för att se vad vi hämtar
echo "<pre>";
print_r($myArray);
echo "</pre>";
?>

Ska försöka göra schemat i HTML format. Får se hur det går :)

138 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)