http://php.net/manual/en/splfileobject.getcsvcontrol.php


<?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
Laat je array eens zien ([php]print_r()[/php])
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?

<?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:
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?
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.
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:
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.
EN hoe kan dit dan wel ?

[size=xsmall]Toevoeging op 06/12/2018 00:12:14:[/size]

UPDATE

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


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);
}
	



	$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?
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.

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?

waarom gaat debuggen niet?

¯\_(·_·)_/¯

Reageren