[PHP] gedeeltelijk een file laden en bewerken?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 20-08 17:30
Bij een bepaalde game die ik speel heb in een addon die na een bepaalde instance een hoop informatie in een file opslaat over raids, waarbij het de bedoeling is dat deze info opgeslagen wordt in een MYSQL database.. Echter kan ik nergens vinden welke functies ik hier het beste voor kan gebruiken..

Een stukje voorbeeld uit die text file:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    ["RaidName"] = "MC SYN 2",
    ["SDate"] = "050829",
    ["RDate"] = "08/29/05",
    ["ScenRaidLoot"] = {
        ["junkItems"] = {
        },
        ["LegendaryItems"] = {
        },
        ["purpleItems"] = {
            [1] = "Vernita¬Gutgore Ripper¬17071:0:0:0¬ffa335ee¬510",
            [2] = "Joseph¬Helm of Might¬16866:0:0:0¬ffa335ee¬530",
            [3] = "Miso¬Quick Strike Ring¬18821:0:0:0¬ffa335ee¬410",
            [4] = "Nottoohot¬Arcanist Mantle¬16797:0:0:0¬ffa335ee¬260",
            [5] = "Grifin¬Lawbringer Spaulders¬16856:0:0:0¬ffa335ee¬620",
            [6] = "Vargánya¬Cenarion Gloves¬16831:0:0:0¬ffa335ee¬500",
            [7] = "Mya¬Boots of Prophecy¬16811:0:0:0¬ffa335ee¬520",
        },
        ["blueItems"] = {
            [1] = "Sejbi¬Lava Core¬17011:0:0:0¬ff0070dd¬40",
            [2] = "Sejbi¬Lava Core¬17011:0:0:0¬ff0070dd¬40",
            [3] = "Dexter¬Fiery Core¬17010:0:0:0¬ff0070dd¬15",
            [4] = "Sejbi¬Lava Core¬17011:0:0:0¬ff0070dd¬40",
        },
        ["greenItems"] = {
            [1] = "Guild Bank¬Granite Necklace of the Gorilla¬12036:0:951:1035165184¬ff1eff00¬0",
            [2] = "Vargánya¬Eternium Lockbox¬5760:0:0:0¬ff1eff00¬0",
            [3] = "Guild Bank¬Essence of Earth¬7076:0:0:0¬ff1eff00¬0",
            [4] = "Medule¬Mystical Leggings of Spirit¬10177:0:418:1554218752¬ff1eff00¬0",
            [5] = "Guild Bank¬Essence of Earth¬7076:0:0:0¬ff1eff00¬0",
            [6] = "Guild Bank¬Essence of Fire¬7078:0:0:0¬ff1eff00¬0",
            [7] = "Balty¬Grinning Axe of the Whale¬1639:0:1048:3379367¬ff1eff00¬0",
            [8] = "Guild Bank¬Essence of Fire¬7078:0:0:0¬ff1eff00¬0",
        },
    },


Mijn vraag is met welke functies zou ik dit het beste kunnen inladen in een MSQL database.. lk heb al met STRPOS, SUBSTR, FSCANF bepaalde delen uit zo'n lap text proberen te selecteren, maar op een of andere manier wil het totaal niet lukken..

Mijn vraag is, stel ik wil het blok van ["ScenRaidLoot"] = { tot de laatste }, selecteren uit de textfile (welke normaal vele malen langer is dan alleen deze info).. Kan ik dit nu het besteste met een fscanf doen? of zijn er betere oplossingen? Mijn grootste probleem is hoe ik de juiste }, selecteer met fscanf. Daarnaast zijn alle lijsten van [1],[2], variabel in lengte..Zou ik deze na het selecteren van de juiste info met fscanf het beste kunnen bewerken met strpos, substr? of sscanf? Oftewel, welke functies kan ik het beste gebruiken om dit soort files om te zetten in bruikbare informatie?

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Regular expression misschien?

Anders zal je toch echt wat slims moeten verzinnen, want je kan wel een stuk willen inlezen, maar jij wilt dus alleen een bepaald stuk inlezen wat bijvoorbeeld onder 'greenItems' staat (die 8 items). Aangezien de lengte van elke subgroep variabel is, zou je bijvoorbeeld een tokenizer kunnen schrijven die dus je txt file in 'slimme' stukjes opbreekt en op die manier alles bij elkaar houdt.

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

De file lijkt al heel erg sterk op standaard PHP-code; dat kun je misschien in je voordeel gebruiken door de code zo aan te passen dat het echt PHP is. Wat je ook kan doen is gewoon regel voor regel door je file heen lezen met een recursieve functie. Elke keer als je wat vindt tussen [ en ] wordt dat een nieuwe index in een array dat je inleest, en als je een { tegenkomt, dan laat je je recursie in werking treden waarbij je zorgt dat die index in je array zelf ook een array bevat.

Wat betreft mijn eerste oplossing: regular expressions. Wat betreft mijn tweede: strpos en substr, die je gebruikt om een tokenizer te maken. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
Nog een optie:
Met wat slimme replaces kan je de file misschien ook ombouwen naar XML. Daar zijn parsers voor en veel functies, bijvoorbeeld op php.net: xml2array

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als je toch al moet gaan replacen, waarom zou je XML dan nog als tussenstap nemen? Waarom niet direct inlezen in een array?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Vervang = met => en gooi alle blokhaken eruit.
Dan zou
PHP:
1
$bestand = Array(eval("inhoud_van_bestand"));


redelijk in de buurt moeten komen.

[ Voor 7% gewijzigd door frickY op 30-08-2005 13:17 ]


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 20-08 17:30
Als ik het bovenstaande uitvoer krijg ik

Parse error: parse error, unexpected T_DOUBLE_ARROW in /data/home/httpd/html/www.bflashed.nl/HTML/dkp.php(25) : eval()'d code on line 1

Na het inlezen van de file ziet de var $saved er nu zo uit
code:
1
Weg gehaald, code leverde verwarring op.


Waarbij ik die functie aanroep met: $aFile = Array(eval($saved));

[ Voor 158% gewijzigd door Uhmmie op 30-08-2005 16:16 ]

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 20-08 17:30
Dringende vraag.. Stel ik heb dus de variable $saved waar php code in zit, kan ik deze dan nog uit laten voeren?

[ Voor 160% gewijzigd door Uhmmie op 30-08-2005 15:33 ]

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

yep, en die functie heb je al gebruikt: eval

Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 20-08 17:30
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php

$file = file("test.txt");
$tag = 0;
$saved = "";

foreach($file as $key => $line) {
  if ( $tag > 0 and strpos($line, "}") !== false )
    $tag--;

  if ( $tag > 0 and strpos($line, "{") !== false )
    $tag++;

  if ( $tag > 0 ) {
    $line = str_replace("[", "", $line);
    $line = str_replace("]", "", $line);
    $line = str_replace("=", "=>", $line);
    $line = str_replace("=> {", "=>Array(", $line);
    $line = str_replace("},", "),", $line);
    $saved .= $line;
  }
  
  if ( strpos($line, "ScenRaidData") !== false ) {
     $tag++;
  }
}

eval("\$array = Array(".$saved.");");

?>

Wat er nu gebeurd is dat ik uit de test.txt opzoek ga naar een betaalde string.. en daarna de { en } ga tellen, waarbij ik alles wat ik daar tussen door tegen kom om ga zetten naar een php Array structuur in text vorm die ik vervolgens uitvoer via een eval.. Een extreem slordige oplossingen :(..

Wat ik in eerste instantie trouwens had was $array=Array(eval($saved)); Maar dat werkt op een of andere manier niet :(..

[ Voor 34% gewijzigd door Uhmmie op 30-08-2005 15:34 ]

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-09 14:28
Dit klopt niet:
=> { dat moet iets als: => array( zijn

Acties:
  • 0 Henk 'm!

Verwijderd

Wil je het echt netjes doen?

Kijk dan toch hier maar eens naar :)

Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 20-08 17:30
Djluc: Dat probleem was opgelost met mijn laatste stukje code.
Skill4: Ik zal er eens naar kijken.

Currently playing: MTG Arena (PC)

Pagina: 1