Avatar billede kodak Mester
21. januar 2023 - 17:07 Der er 7 kommentarer

match xml og csv fil

Jeg har en xml fil med en masse resultater hvor i jeg gerne vil ha navnet/id'et og resultatet udlæst

de samme navne har jeg i min csv fil.

csv filen er hvad hvilke jeg forventer der skal være, og xml filen er hvad der reelt er.

Derfor vil jeg gerne ha et output hvor jeg kan se hvilke der mangler fra csv'en

CSV eksempel:

V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1
V14-806a-0,V14-806a-0,V14-806a-0,V14-806a-0,V17-813b-1,V14-806a-0,V14-806a-0,V14-806a-0,V14-806a-0,V17-813b-2,V14-806a-0,V14-806a-0,V14-806a-0,V14-806a-0,V17-813b-3,V14-806a-0,V14-806a-0,V14-806a-0,V14-806a-0,V17-813b-4,V14-806a-0,V14-806a-0,V14-806a-0,V14-806a-0
A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24
V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1,V17-608t-1
V14-806a-0,V14-806a-0,V14-806a-0,V14-806a-0,V17-813b-1,V14-806a-0,V14-806a-0,V14-806a-0,V14-806a-0,V17-813b-2,V14-806a-0,V14-806a-0,V14-806a-0,V14-806a-0,V17-813b-3,V14-806a-0,V14-806a-0,V14-806a-0,V14-806a-0,V17-813b-4,V14-806a-0,V14-806a-0,V14-806a-0,V14-806a-0
B1,B2,B3,B4,B5,B6,B7,B8,B9,B10,B11,B12,B13,B14,B15,B16,B17,B18,B19,B20,B21,B22,B23,B24

Linje 1. er første del af navnet på id'et
Linje 2. ikke brugt her
Linje 3. Sidste del af id'et (kan forekomme som eks. B01 el. B1)

xml lille eksempel:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="form/index.xsl"?>
<TestResultSummary>
  <TestSummary>
    <CableID>V17-608t-1.B.20</CableID>
    <FileName>V17-608t-1.B.20</FileName>
    <DateTime>19/01/2023  08:31:21</DateTime>
    <PassFail>FAIL</PassFail>
  </TestSummary>
  <TestSummary>
    <CableID>V17-608t-1.A.19</CableID>
    <FileName>V17-608t-1.A.19</FileName>
    <DateTime>19/01/2023  08:31:01</DateTime>
    <PassFail>PASS</PassFail>
  </TestSummary>
Avatar billede arne_v Ekspert
21. januar 2023 - 18:51 #1
Det er vist en lidt større opgave, men det her skulle gerne hjælpe dig igang:


<?php

function load_xml($fnm) {
    $res = array();
    $xmlfile = new SimpleXMLElement(file_get_contents($fnm));
    foreach($xmlfile->TestSummary as $tstsum) {
        $res[] = preg_replace('/([A-Z])\.(\d+)/', '$1$2', $tstsum->CableID);
    }
    return $res;
}

function load_csv($fnm) {
    $res = array();
    $fp = fopen($fnm, 'r');
    $recno = 0;
    while($rec = fgetcsv($fp, 1000, ',')) {
        $recno++;
        if($recno % 3 == 1) {
            $firstpart = $rec;
        }
        if($recno % 3 == 0) {
            $lastpart = $rec;
            for($i = 0; $i < count($lastpart); $i++) {
                $res[] = $firstpart[$i] . '.' . $lastpart[$i];
            }
        }
    }
    fclose($fp);
    return $res;
}

$xmllst = load_xml("/work/z.xml");
$csvlst = load_csv("/work/z.csv");
echo "In XML but not in CSV:\r\n";
foreach(array_diff($xmllst, $csvlst) as $val) {
    echo "  $val\r\n";
}
echo "In CSV but not in XML:\r\n";
foreach(array_diff($csvlst, $xmllst) as $val) {
    echo "  $val\r\n";
}
?>
Avatar billede kodak Mester
21. januar 2023 - 20:38 #2
Jeg kan ikke helt se stadiet.

For den finder ikke nogle match, skal lige vide om det er for inden der det er stoppet.

http://line-web.dk/fil_match/index.php

Jeg havde lidt iden om at den lister alle navne fra csv'en og så ud for hver er der opgivet om den er opfyldt eller ej.
Avatar billede arne_v Ekspert
22. januar 2023 - 01:06 #3
Du kan jo få den til at gøre hvad du vil.

ådiv¨<?php

function load_xml($fnm) {
    $res = array();
    $xmlfile = new SimpleXMLElement(file_get_contents($fnm));
    foreach($xmlfile->TestSummary as $tstsum) {
        $res[] = preg_replace('/([A-Z])\.(\d+)/', '$1$2', $tstsum->CableID);
    }
    return $res;
}

function load_csv($fnm) {
    $res = array();
    $fp = fopen($fnm, 'r');
    $recno = 0;
    while($rec = fgetcsv($fp, 1000, ',')) {
        $recno++;
        if($recno % 3 == 1) {
            $firstpart = $rec;
        }
        if($recno % 3 == 0) {
            $lastpart = $rec;
            for($i = 0; $i < count($lastpart); $i++) {
                $res[] = $firstpart[$i] . '.' . $lastpart[$i];
            }
        }
    }
    fclose($fp);
    return $res;
}

$xmllst = load_xml("/work/z.xml");
$csvlst = load_csv("/work/z.csv");

foreach($csvlst as $val) {
    echo $val . (in_array($val, $xmllst) ? ' is in XML' : ' is not in XML') . "\r\n";
}
?>
å-div
Avatar billede kodak Mester
22. januar 2023 - 01:36 #4
Med lidt Tweak fik jeg den til at vise det rette.
Nu mangler jeg bare at få <PassFail> relultatet med. FAIL or PASS

<?php

function load_xml($fnm) {
    $res = array();
    $xmlfile = new SimpleXMLElement(file_get_contents($fnm));
    foreach($xmlfile->TestSummary as $tstsum) {
        $res[] = preg_replace('/([A-Z])\.(\d+)/', '$1$2', $tstsum->CableID);
    }
    return $res;
}

function load_csv($fnm) {
    $res = array();
    $fp = fopen($fnm, 'r');
    $recno = 0;
    while($rec = fgetcsv($fp, 1000, ',')) {
        $recno++;
        if($recno % 3 == 1) {
            $firstpart = $rec;
        }
        if($recno % 3 == 0) {
            $lastpart = $rec;
            for($i = 0; $i < count($lastpart); $i++) {
                $res[] = $firstpart[$i] . '_' . $lastpart[$i];
            }
        }
    }
    fclose($fp);
    return $res;
}

$xmllst = load_xml("work/z.xml");
$csvlst = load_csv("work/z.csv");

foreach($csvlst as $val) {
    if(!$val == in_array($val, $xmllst)){
        echo $val.'</br>';
    } else if($val_stat == 'FAIL'){
        echo $val.'</br>';
    }
    //echo $val . (in_array($val, $xmllst) ? ' is in XML' : ' is not in XML') . "</br>\r\n";
}
?>
Avatar billede arne_v Ekspert
22. januar 2023 - 02:31 #5
Lav $xmllst til et associatiovt array.


<?php

function load_xml($fnm) {
    $res = array();
    $xmlfile = new SimpleXMLElement(file_get_contents($fnm));
    foreach($xmlfile->TestSummary as $tstsum) {
        $id = preg_replace('/([A-Z])\.(\d+)/', '$1$2', $tstsum->CableID);
        $status = $tstsum->PassFail;
        $res[$id] = $status;
    }
    return $res;
}

function load_csv($fnm) {
    $res = array();
    $fp = fopen($fnm, 'r');
    $recno = 0;
    while($rec = fgetcsv($fp, 1000, ',')) {
        $recno++;
        if($recno % 3 == 1) {
            $firstpart = $rec;
        }
        if($recno % 3 == 0) {
            $lastpart = $rec;
            for($i = 0; $i < count($lastpart); $i++) {
                $res[] = $firstpart[$i] . '.' . $lastpart[$i];
            }
        }
    }
    fclose($fp);
    return $res;
}

$xmllst = load_xml("/work/z.xml");
$csvlst = load_csv("/work/z.csv");

foreach($csvlst as $val) {
    echo $val . (array_key_exists($val, $xmllst) ? ' is in XML (' . $xmllst[$val] . ')' : ' is not in XML') . "\r\n";
}
?>
Avatar billede kodak Mester
22. januar 2023 - 11:21 #6
Det giver mig stadig ikke noget ressultat uds fra PassFail

er vores opsætning meget anderledes?
jeg skal ikke ha '/' først i fil stien og '\r\n' virker ikke hos mig.
Avatar billede arne_v Ekspert
22. januar 2023 - 15:31 #7
Filens placering skal naturligvis rettes til efter kontekst.

Og "\r\n" virker kun ved console. Med en rigtig web side skal der bruges HTML.

Men intet af det er vigtigt.

Det vigtige er at:

$xmllst = load_xml("filnavn");

loader et associativt array således at array_key_exists($val, $xmllst) kan teste på om noget er i array og $xmllst[$val] vil returnere PassFail status.
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

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