delimiter, en enclosure van csv feed

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Daniel van Seggelen

Daniel van Seggelen

28/11/2018 09:46:42
Quote Anchor link
http://php.net/manual/en/splfileobject.getcsvcontrol.php

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php

$file_seperate
= new SplFileObject(DOC_ROOT.'shopconnector/feeds/feed'.$id.'import.csv');

echo $file_seperate->getCsvControl()[0];


?>


Ik krijg hiermee een array terug, maar om deze array te splitten gaat niet.
Ik wil een delimiter en een enclosure hebben
 
PHP hulp

PHP hulp

26/11/2024 08:37:13
 
- Ariën  -
Beheerder

- Ariën -

28/11/2018 10:07:37
Quote Anchor link
Laat je array eens zien (print_r())
 
Thomas van den Heuvel

Thomas van den Heuvel

28/11/2018 14:41:16
Quote Anchor link
Dat is hoe de functie werkt - zou het lukken om variabelen uit een array uit te lezen?

Wat @Ariën zegt, al eens print_r() geprobeerd? Dit wordt zelfs in het voorbeeld in de door jouw verschafte documentatielink gebruikt.

Probeer het anders eens met list(), of je kunt ook op basis van index alles toekennen aan aparte variabelen.

Dit valt simpelweg onder (eenvoudige) array-manipulatie en heeft verder niet zoveel te maken met de SplFileObject class?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
// $file_seperate is niet zo'n fantastische naam...
$file = '...';
$document = new SplFileObject($file);
list($delimiter, $enclosure, $escapeCharacter) = $document->getCsvControl();
?>


En kijk ook eens in de user comments van bovengenoemde pagina:
Quote:
Note that this function does not magically guess the CSV control from a given file, rather it returns what has been priorly set with SplFileObject::setCsvControl().

Dus waarschijnlijk, als het je doel is om hiermee af te leiden wat voor controle karakters een willekeurig CSV-bestand heeft, is dit sowieso ongeschikt voor wat je probeert te bereiken?
 
Daniel van Seggelen

Daniel van Seggelen

05/12/2018 16:07:59
Quote Anchor link
Dit staat in de array:

Array ( [0] => , [1] => " [2] => \ )

maar het bestand ziet er zo uit.

"url";"title";"description";"offerid";"image";"

Dus het moet ; (delimiter) en " (enclosure) zijn, werkt dus voor geen meter.
 
Thomas van den Heuvel

Thomas van den Heuvel

05/12/2018 16:37:01
Quote Anchor link
Lees mijn laatste reactie nogmaals:
Thomas van den Heuvel op 28/11/2018 14:41:16:
En kijk ook eens in de user comments van bovengenoemde pagina:
Quote:
Note that this function does not magically guess the CSV control from a given file, rather it returns what has been priorly set with SplFileObject::setCsvControl().

Dus waarschijnlijk, als het je doel is om hiermee af te leiden wat voor controle karakters een willekeurig CSV-bestand heeft, is dit sowieso ongeschikt voor wat je probeert te bereiken?

Je kunt deze functionaliteit dus niet gebruiken om te bepalen welke controlekarakters gebruikt worden in een CSV-bestand, je kunt enkel uitlezen wat is ingesteld / de default is.
 
Daniel van Seggelen

Daniel van Seggelen

05/12/2018 22:48:52
Quote Anchor link
EN hoe kan dit dan wel ?

Toevoeging op 06/12/2018 00:12:14:

UPDATE

Ik gebruikt de volgende functie dan maar wat lijkt te werken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public function detectDelimiter($csvFile)
{
    $delimiters = array(
        ';' => 0,
        ',' => 0,
        "\t" => 0,
        "|" => 0
    );

    $handle = fopen($csvFile, "r");
    $firstLine = fgets($handle);
    fclose($handle);
    foreach ($delimiters as $delimiter => &$count) {
        $count = count(str_getcsv($firstLine, $delimiter));
    }

    return array_search(max($delimiters), $delimiters);
}
    


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
    $update = $DBD->conn()->prepare('UPDATE datafeed set enclose = ?, delimiter =? ,status =? ,last_download = ?, aantal = ? WHERE id = ?') or die (mysqli_error($DBD->conn()));
    $update->bind_param( "ssssss",$enclosure,$delimiter,$status,$datenow,$length,$id);

    if (!$update->execute()) {
                echo 'error executing statement: ' . $update->error;
                $error = 1;
                die();
            }     else {
            echo 'goed';    
            }


Alleen het updaten gaat niet en errors krijg ik niet, want hij geeft een goed terug, maar niks is geupdate.
waarom gaat debuggen niet?
 
Thomas van den Heuvel

Thomas van den Heuvel

06/12/2018 01:14:10
Quote Anchor link
Je zou de inhoud van het bestand kunnen bestuderen met reguliere expressies wellicht, maar het zou natuurlijk beter zijn als je gewoon afspraken kunt maken met de leverancier over de vorm waarin gecommuniceerd wordt en dan dus uit kunnen gaan van vaste symbolen...

EDIT: of je zou de eerste regel kunnen exploden op een potentiële delimiter, en dan het aantal elementen kunnen tellen (weet je uberhaupt hoeveel dit er zijn?). Het eerste en laatste karakter van de ge-explode elementen zou dan het enclosure-karakter moeten zijn, althans, mits de bestanden opgesteld zijn volgens de regels der CSV-kunst. Anders is het echt een gevalletje all bets are off.

Quote:
Alleen het updaten gaat niet en errors krijg ik niet, want hij geeft een goed terug, maar niks is geupdate.
Een query die syntactisch goed is is niet fout, ook al doet deze effectief niets. Wellicht klopt je WHERE-conditie niet?

Quote:
waarom gaat debuggen niet?

¯\_(·_·)_/¯
Gewijzigd op 06/12/2018 15:33:18 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.