delimiter, en enclosure van csv feed
http://php.net/manual/en/splfileobject.getcsvcontrol.php
Ik krijg hiermee een array terug, maar om deze array te splitten gaat niet.
Ik wil een delimiter en een enclosure hebben
Code (php)
1
2
3
4
5
6
7
8
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];
?>
$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
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)
1
2
3
4
5
6
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();
?>
// $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?
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 op 28/11/2018 14:41:16:
En kijk ook eens in de user comments van bovengenoemde pagina:
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?
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.
Toevoeging op 06/12/2018 00:12:14:
UPDATE
Ik gebruikt de volgende functie dan maar wat lijkt te werken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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);
}
{
$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)
1
2
3
4
5
6
7
8
9
10
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';
}
$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?
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:
Een query die syntactisch goed is is niet fout, ook al doet deze effectief niets. Wellicht klopt je WHERE-conditie niet?Alleen het updaten gaat niet en errors krijg ik niet, want hij geeft een goed terug, maar niks is geupdate.
Quote:
waarom gaat debuggen niet?
¯\_(·_·)_/¯
Gewijzigd op 06/12/2018 15:33:18 door Thomas van den Heuvel