Avatar billede safl Nybegynder
02. august 2003 - 20:55 Der er 17 kommentarer og
1 løsning

Fil-parser

Hello!

Jeg har brug for ideer til hvordan jeg smider indholdet af en bestemt formateret fil ind i en mysql database. Filen er fyldt med "records" der ser sådan ud:

Card Name:    Akroma's Blessing
Card Color:    W
Mana Cost:    2W
Type & Class:    Instant
Pow/Tou:   
Card Text:    Creatures you control gain protection from the color of your
        choice until end of turn. Cycling W (W, Discard this card from
        your hand: Draw a card.)
Flavor Text:    The clerics saw her as a divine gift. She saw them only as allies
        in her war against Phage.
Artist:        Adam Rex
Rarity:        U
Card #:        1/350

Hvordan hiver jeg denne information ud af filen?

mvh safl
Avatar billede kinguru Nybegynder
02. august 2003 - 22:11 #1
Du kunne prøve med regular expressions!
Avatar billede kinguru Nybegynder
02. august 2003 - 22:13 #2
Overholder hele filen så den der standard?

Altså der er ikke nogen steder hvor det måske er skrevet anderledes eller lign?
Avatar billede detox Nybegynder
02. august 2003 - 22:17 #3
Du kan prøve med så noget lign.:
---------
<?
$lines = file('text.txt');
$i = 0;
foreach ($lines as $line) {
    if (strstr($line, ":  ")) {
        list($key[$i], $val[$i]) = explode (":  ", $line);
        $i++;
    }else{
        $val[$i-1] .= $line;
    }
}
$size = count($val);
for ($i=0;$i<$size;$i++){
    $val[$i] = "'" .$val[$i]. "'";
}
$keystr = implode(', ', $key);
$valstr = implode(', ', $val);

mysql_query("INSERT INTO cards ($keystr) VALUES ($valstr)") or die(mysql_error());
?>
Avatar billede detox Nybegynder
02. august 2003 - 22:22 #4
Det forudsætter naturligvis du har en tabel (cards) med kolonnenavne der svarer til. Jeg er lidt i tvivl om du kan få problemer med /#& i kolonnenavnene?
Avatar billede detox Nybegynder
02. august 2003 - 22:33 #5
Det ser ud til at være ok at bruge: #&/, hvis man bruger backtics sådan her:
--------------
<?
$lines = file('text.txt');
$i = 0;
foreach ($lines as $line) {
    if (strstr($line, ":  ")) {
        list($key[$i], $val[$i]) = explode (":  ", $line);
        $i++;
    }else{
        $val[$i-1] .= $line;
    }
}
$size = count($val);
for ($i=0;$i<$size;$i++){
    $val[$i] = "'" .$val[$i]. "'";
    $key[$i] = "`" .$key[$i]. "`";
}
$keystr = implode(', ', $key);
$valstr = implode(', ', $val);

mysql_query("INSERT INTO cards ($keystr) VALUES ($valstr)") or die(mysql_error());
?>
Avatar billede safl Nybegynder
06. august 2003 - 13:16 #6
Beklager min mangel på respons.

detox> Det virker ikke helt hos mig :(

Jeg har grebet det an på en lidt anden måde. Indtil videre ser det sådan ud:

$expr = "/Card Name:\t(.*)\nCard Color:\t(.*)\nMana Cost:\t(.*)\nType & Class:\t(.*)\n/";

$spoiler = file_get_contents('text.txt');

preg_match_all($expr, $spoiler, $matches);

echo $matches[1][0]; //Card name
echo $matches[2][0]; //Card Color
echo $matches[3][0]; //Casting Cost
echo $matches[4][0]; //Type & Class
Avatar billede safl Nybegynder
06. august 2003 - 13:33 #7
Sådan ser koden så ud efter lidt mere eksperimentering:

<?php

$expr = "/Card Name:\t(.*)\nCard Color:\t(.*)\nMana Cost:\t(.*)\nType & Class:\t(.*)\nPow\/Tou:\t(.*)\nCard Text:\t(.*).\n/";
$spoiler = file_get_contents('text.txt');

preg_match_all($expr, $spoiler, $matches);

echo $matches[1][0]; //Card name
echo $matches[2][0]; //Card Color
echo $matches[3][0]; //Casting Cost
echo $matches[4][0]; //Type & Class
echo $matches[5][0]; //Power & Toughness
echo $matches[6][0]; //Card Text

?>

Problemet er egentlig ret simpelt, jeg ved ikke hvordan jeg skal matche flavor - og cardtext. Pga. newlines. Hvordan løser jeg det?
Avatar billede safl Nybegynder
09. august 2003 - 14:21 #8
Tjaa jeg bruger regular expressions og detox forslag virker ikke så kinguru får lidt af pointene.
Avatar billede safl Nybegynder
09. august 2003 - 14:22 #9
Hvis han kan få udtrykket til at virke.
Avatar billede detox Nybegynder
09. august 2003 - 14:43 #10
Ok, fair nok. Jeg forstår bare ikke du ikke kan få mit forslag til at virke, det virker her hos mig. Kan du få pregmatch til at virke er det osse en god løsning. Den med newline er jo lidt kringlet (Jeg lavede osse et krumspring) c",)
Avatar billede detox Nybegynder
09. august 2003 - 15:01 #11
Du skal nok se på multiline modifier'en 'm'
Avatar billede kinguru Nybegynder
09. august 2003 - 18:59 #12
Cool! :)
Avatar billede safl Nybegynder
09. august 2003 - 19:20 #13
kinguru> kan du få det til at virke?
Avatar billede kinguru Nybegynder
09. august 2003 - 20:54 #14
Jeg kan prøve...
Avatar billede kinguru Nybegynder
09. august 2003 - 21:14 #15
Hmm! safl -> Jeg kan ikke se problemet med det eksempel detox kom med... Har testet det, og det ser ud til at fungere!

Hvad er det der går galt når du prøver det?
Avatar billede safl Nybegynder
11. august 2003 - 11:31 #16
Tjaa indholdet af $keystr er lig med "''" og indholdet af $valstr er hele filen. Det fik jeg jo ikke så meget ud af :(
Desuden foretrækker jeg at få det ordnet med et reg. expr. da det er mere "rent".
Avatar billede detox Nybegynder
11. august 2003 - 12:18 #17
Tjah, jeg var ikke opmærksom på at de 4 mellemrum var en tab. Så her er en fungerende version. Hvor vidt den er mere eller mindre ren end regexp, vil jeg ikke kommentere, men det virker (udskift print med mysql_query).

<?
$lines = file('text.txt');
$i = 0;
foreach ($lines as $line) {
    if (strstr($line, ":\t")) {
            list($key[$i], $val[$i]) = explode (":\t", $line);
        $i++;
    }else{
        $val[$i-1] .= $line;
    }
}
$size = count($val);
for ($i=0;$i<$size;$i++){
    $val[$i] = "'" .$val[$i]. "'";
    $key[$i] = "`" .$key[$i]. "`";
}
$keystr = implode(', ', $key);
$valstr = implode(', ', $val);

print("INSERT INTO cards ($keystr) VALUES ($valstr)") or die(mysql_error());
?>
Avatar billede safl Nybegynder
12. august 2003 - 11:04 #18
Tjaa den "virker" da men helt cool er den nu ikke, der er tabs i værdierne og den tager en masse med som den ikke burde snuppe. Jeg ville helt klart foretrække en reg.expr.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester