Avatar billede nemlig Forsker
01. december 2021 - 19:28 Der er 4 kommentarer

MySQL til CSV - problem med tal

Hejsa.
Jeg har lavet et udtræk af talværdier fra MySQL til CSV, men Excel opfatter talværdierne som tekst.

Talværdien er i SQL gemt med typen decimal(9,2).
Når jeg åbner CSV-filen i dansk version af Excel, så vises talværdien ikke med komma, men med decimal.
Jeg gætter på, at jeg blot skal køre
str_replace(".",",",$row);

Men min udfordring er, at der i udtrækket fra SQL er ca. 60 forskellige kolonner.

Min kode ser sådan her ud:
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment;filename=eksport.csv');
ob_start();
$df = fopen("php://output", 'w');

fprintf($df, chr(0xEF).chr(0xBB).chr(0xBF));
//kolonneoverskrifter
$fields = array('id', 'Dato/Tid', '3.28', '3.29', '3.30', '3.31' ,'3.32'); //afkortet

fputcsv($df, $fields, ";");

//Hent fra SQL
$cols = Array("*");
$db->where('DATE(tid) <= ? AND DATE(tid) >= ? ', array('2021-11-30','2021-11-28'));
$rows = $db->get("temp_rum", null, $cols);

    foreach ($rows as $row) {
        fputcsv($df, $row, ";");
    }

fclose($df);
echo ob_get_clean();
Avatar billede nemlig Forsker
01. december 2021 - 20:36 #1
Jeg har løst det ved at smide denne kode ind i min foreach-loop:
for ($x = 1; $x <= 63; $x++) {
            $row[$x] = number_format($row[$x], 2, ',', '.');
        }

Løsningen var enkel, da kolonnenavnene bestod af fortløbende tal fra 1-63.
Men der findes nok en mere elegant løsning.
Avatar billede arne_v Ekspert
01. december 2021 - 21:59 #2
Demo:

<?php
$a = array(1.1, 2.2, 3.3);
$f = fopen("php://output", 'w');
fputcsv($f, $a, ';');
//setlocale(LC_ALL, 'da_DK'); // *nix
setlocale(LC_ALL, 'dan_DNK'); // windows
fputcsv($f, $a, ';');
?>

Avatar billede arne_v Ekspert
02. december 2021 - 02:32 #3
Bemærk dog:

https://www.php.net/manual/en/function.setlocale.php

Warning

The locale information is maintained per process, not per thread. If you are running PHP on a multithreaded server API , you may experience sudden changes in locale settings while a script is running, though the script itself never called setlocale(). This happens due to other scripts running in different threads of the same process at the same time, changing the process-wide locale using setlocale(). On Windows, locale information is maintained per thread as of PHP 7.0.5.
Avatar billede nemlig Forsker
02. december 2021 - 12:27 #4
Tak for input Arne. Det prøver jeg i aften.
Scriptet afvikles på et alm. Linux-webhotel hos Wannafind.
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





CIO
Sådan tager top-CIO Pernille Geneser livtag med 40 år gamle it-systemer i Stark Group med 10.000 medarbejdere