Avatar billede mkjaer Nybegynder
07. februar 2007 - 20:59 Der er 6 kommentarer og
1 løsning

Escape komma i output til csv-fil

Hejsa,

Jeg bruger nedenstående script til at lave udtræk fra mysql til en csv-fil. Mit problem er at der er kommaer i noget af teksten fra mysql, og dermed forskydes dataene i csv-filen. Jeg formoder, jeg skal escape kommaerne, så det ikke opfattes som et 'næste-felt'-komma.

How to?

<?php

$list = array ('id,navn,firma,titel,adresse,postnummer,bynavn,telefon,email,kundenummer,mobil,fabrikat,model,ansatte,pauseindtil,leveringsdato,produktnavn,forhandlernavn,forhandlertelefon,oprettet,trybuystatus');

$f_produkter = mysql_query("SELECT trybuyemner.id,trybuyemner.navn,trybuyemner.firma,trybuyemner.titel, trybuyemner.adresse,trybuyemner.postnummer,postnumre.bynavn,trybuyemner.telefon,trybuyemner.email,forhandler.kundenummer,trybuyemner.mobiltelefon,trybuyemner.telefonfabrikat,trybuyemner.telefonmodel,trybuyemner.antalansatte,IF(trybuyemner.pausedato>0,FROM_UNIXTIME( trybuyemner.pausedato, '%d.%m.%Y'),NULL) AS pausedato ,IF(trybuyemner.leveringdato>0,FROM_UNIXTIME( trybuyemner.leveringdato, '%d.%m.%Y'),NULL) AS leveringdato, produkt.navn AS produktnavn, forhandler.navn AS forhandlernavn, forhandler.telefon AS forhandlertelefon, FROM_UNIXTIME( trybuyemner.oprettet, '%d.%m.%Y' ) AS oprettet, trybuyemner.trybuystatus FROM trybuyemner LEFT JOIN produkt ON trybuyemner.produkt = produkt.id LEFT JOIN forhandler ON trybuyemner.forhandler = forhandler.id LEFT JOIN postnumre ON postnumre.postnr=trybuyemner.postnummer") or die (mysql_error());
while($d_produkter = mysql_fetch_array($f_produkter))
{
array_push ($list, "$d_produkter[0],$d_produkter[1],$d_produkter[2],$d_produkter[3],$d_produkter[4],$d_produkter[5],$d_produkter[6],$d_produkter[7],$d_produkter[8],$d_produkter[9],$d_produkter[10],$d_produkter[11],$d_produkter[12],$d_produkter[13],$d_produkter[14],$d_produkter[15],$d_produkter[16],$d_produkter[17],$d_produkter[18],$d_produkter[19],$d_produkter[20],$d_produkter[21]");
}
$fp = fopen('../mappe4534/output.csv', 'w');
foreach ($list as $line) {
  fputcsv($fp, split(',', $line),";");
}
fclose($fp);
?>

Takker forud,
Martin
Avatar billede jakobdo Ekspert
07. februar 2007 - 22:24 #1
Inden du kalder linien: fputcsv($fp, split(',', $line),";");
Så kunne du lave en str_replace() på $line og replace , til f.eks. ;: eller hvad du kunne finde på.
Avatar billede mkjaer Nybegynder
08. februar 2007 - 08:26 #2
Jo, men mit spørgsmål på, hvordan jeg kan escape kommaet, så det fortsat kan fremstå i feltet (uden at hoppe til næste felt), a la \" i normal php-kode. Måske skal jeg str-replace kommaet med en chr(xx) ?!?
Avatar billede jakobdo Ekspert
08. februar 2007 - 08:32 #3
Jeg har lige læst på CSV standarden, og komma i en linie, skal sættes ind i: "Noget, andet", altså "" omkring teksten.
Avatar billede mkjaer Nybegynder
17. februar 2007 - 16:23 #4
lukker og slukker.
Avatar billede jakobdo Ekspert
17. februar 2007 - 18:35 #5
Så det vil sige du brugte en anden end min løsning?
Avatar billede mkjaer Nybegynder
17. februar 2007 - 23:02 #6
Ja, min ven. Når jeg brugte din løsning, så røg hver felt ind på en ny linie. Jeg kom på, at skifte kommaet i linien:

fputcsv($fp, split(',', $line),";");

ud med

fputcsv($fp, split('%!', $line),";");

og så bruge %! som 'næste-felt' markering. "%!" forekommer ikke så tit i dataene, så dermed slipper jeg for fejlen, når data indeholder kommaer. En lavpraktisk løsning, men den virker.

Mit spørgsmål gik jo også på hvordan jeg kunne escape kommaerne i dataene, så de ikke blev fortolket af fputcsv-funktionen.

Hvis du føler jeg har snydt dig for points, så sig til - det er jeg nemlig ikke ude på.

Hilsen
Martin
Avatar billede jakobdo Ekspert
18. februar 2007 - 11:24 #7
Det er helt ok.
Eksperten bygger jo netop på spørgsmål og svar!
Derfor skulle din løsning lige vises, så andre måske kunne bruge den, hvis de løber ind i samme problem.
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