MSSQL export to CSV: number_format
Ik heb een werkend script dat vanuit MSSQL data exporteert naar csv. Wanneer ik het bestand met notepad open krijg ik .0000;1234.5600; enz.
De juiste waarden van bovenstaand voorbeeld is: 0.00 en 1234.56. Er komen dus telkens 2 extra nullen aan het eind bij. Bij 0.00 laat ie de eerste 0 niet zien.
In MSSQL heb ik het Money format, ik heb met dit probleem meer ervaring, dit heeft te maken met een number_format, alleen ik weet niet hoe ik number_format kan implementeren in mijn script.
hieronder het script:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
include'connection.php';
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
$fileName = 'test.csv';
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename={$fileName}");
header("Expires: 0");
header("Pragma: public");
$fh = fopen( 'php://output', 'w' );
$query = "SELECT * FROM table";
$res = odbc_exec($db,$query);
$headerDisplayed = false;
// Add a header row if it hasn't been added yet
while($row = odbc_fetch_array($res)){
if ( !$headerDisplayed ) {
// Use the keys from $data as the titles
fputcsv($fh, array_keys($row), ";");
$headerDisplayed = true;
}
// Put the data into the stream
fputcsv($fh, $row, ";");
}
// Close the file
fclose($fh);
// Make sure nothing else is sent, our file is done
exit;
?>
include'connection.php';
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
$fileName = 'test.csv';
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename={$fileName}");
header("Expires: 0");
header("Pragma: public");
$fh = fopen( 'php://output', 'w' );
$query = "SELECT * FROM table";
$res = odbc_exec($db,$query);
$headerDisplayed = false;
// Add a header row if it hasn't been added yet
while($row = odbc_fetch_array($res)){
if ( !$headerDisplayed ) {
// Use the keys from $data as the titles
fputcsv($fh, array_keys($row), ";");
$headerDisplayed = true;
}
// Put the data into the stream
fputcsv($fh, $row, ";");
}
// Close the file
fclose($fh);
// Make sure nothing else is sent, our file is done
exit;
?>
Alvast bedankt.
Gewijzigd op 30/05/2015 17:48:01 door Dennis B
Voor regel 33 de kolommen van $row die van het "Money format" zijn aanpassen met number_format()?
Bedankt voor je reactie.
Dit heb ik al getest op de volgende manier: fputcsv($fh, number_format($row,2), ";");
Maar dit werkt helaas niet.
Alvast bedankt.
Noot: je wil de "thousand separator" waarschijnlijk ook leeg maken (4e parameter number_format()).
Zoiets dus:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
// ...
// array with names of "Money format" columns
$moneyColumns = array('momoney', 'moprobs');
while ($row = odbc_fetch_array($res)){
if (!$headerDisplayed) {
// Use the keys from $data as the titles
fputcsv($fh, array_keys($row), ";");
$headerDisplayed = true;
}
// adjust money columns
foreach ($moneyColumns as $moneyCol) {
$row[$moneyCol] = number_format($row[$moneyCol], 2, '.', '');
}
// current row is now correctly modified for insertion into CSV
// Put the data into the stream
fputcsv($fh, $row, ";");
}
?>
// ...
// array with names of "Money format" columns
$moneyColumns = array('momoney', 'moprobs');
while ($row = odbc_fetch_array($res)){
if (!$headerDisplayed) {
// Use the keys from $data as the titles
fputcsv($fh, array_keys($row), ";");
$headerDisplayed = true;
}
// adjust money columns
foreach ($moneyColumns as $moneyCol) {
$row[$moneyCol] = number_format($row[$moneyCol], 2, '.', '');
}
// current row is now correctly modified for insertion into CSV
// Put the data into the stream
fputcsv($fh, $row, ";");
}
?>
Bedankt voor de reactie, waar haal je de momoney en de moprobs vandaan? Of wat wil dat zeggen, daar krijg ik nu een foutmelding van.
[fout]Verander "odbc_fetch_array" naar "odbc_fetch_row" en pas de "$moneyColumns" array aan met de kolom naam(en) van je database waar het geld bedrag in staat.[/fout]
Als je dat niet weet, plaats dan even in de while loop:
Misschien dat je dan wel ziet wat je doet.
Ja, ik kan het voor je voorkauwen zodat je het kan copy-pasten maar zo leer je het niet.
Gewijzigd op 31/05/2015 01:44:21 door Johan K
Het zijn meerdere kolomnamen maar via mijn huidige code haalt ie alles op, zonder dat ik ik alle kolommen moet benoemen, met een nummer of met de naam. Of is dit niet mogelijk wat ik wil? Ik wil mijn script namelijk zo dynamisch mogelijk hebben.
Ik zal morgen die print_r is gebruiken.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
# odbc_fetch_array()
$row = array(
0 => 'waarde 1' // van de eerste kolom in je db
1 => 'nog een waarde' // van de tweede kolom in je db
2 => 'meh' // etc.
)
echo $row[2] // meh
# odbc_fetch_row()
$row = array(
'kolomnaam1' => 'waarde 1'
'monies' => 'nog een waarde'
'paid' => 'meh'
)
echo $row['monies']; // nog een waarde
?>
# odbc_fetch_array()
$row = array(
0 => 'waarde 1' // van de eerste kolom in je db
1 => 'nog een waarde' // van de tweede kolom in je db
2 => 'meh' // etc.
)
echo $row[2] // meh
# odbc_fetch_row()
$row = array(
'kolomnaam1' => 'waarde 1'
'monies' => 'nog een waarde'
'paid' => 'meh'
)
echo $row['monies']; // nog een waarde
?>
Gewijzigd op 31/05/2015 01:45:06 door Johan K
@Johan K en met odbc_fetch_row() is weer wat anders aan de hand als ik PHP.net mag geloven, deze moet je gebruiken in combinatie met odbc_result(), want odbc_fetch_row() geeft enkel een boolean terug...
Je zult dus iig wat moeten experimenteren met de odbc functies.
Thomas van den Heuvel op 31/05/2015 01:01:57:
Errr, dat wordt lastig als je bedragen in specifieke kolommen wilt omzetten? Tenzij alle kolommen bedragen bevatten? Je geeft ook niet echt aan hoe je tabel eruit ziet he.
@Johan K en met odbc_fetch_row() is weer wat anders aan de hand als ik PHP.net mag geloven, deze moet je gebruiken in combinatie met odbc_result(), want odbc_fetch_row() geeft enkel een boolean terug...
Je zult dus iig wat moeten experimenteren met de odbc functies.
@Johan K en met odbc_fetch_row() is weer wat anders aan de hand als ik PHP.net mag geloven, deze moet je gebruiken in combinatie met odbc_result(), want odbc_fetch_row() geeft enkel een boolean terug...
Je zult dus iig wat moeten experimenteren met de odbc functies.
Je hebt helemaal gelijk, de enigste manier om een kolom naam te krijgen is via "odbc_field_name()" beetje dom van me..
Ik zal het bij deze dan maar toch wel effe voorkauwen omdat ik ook fout zat:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
include'connection.php';
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
$fileName = 'test.csv';
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename={$fileName}");
header("Expires: 0");
header("Pragma: public");
$fh = fopen( 'php://output', 'w' );
$query = "SELECT * FROM table";
$res = odbc_exec($db,$query);
$headerDisplayed = false;
// Add a header row if it hasn't been added yet
while($row = odbc_fetch_array($res)){
$i = 1; // gebruik print_r($row) om er achter te komen welke array index jouw "currency" bevat.
$row[$i] = number_format( $row[$i], 2 );
if ( !$headerDisplayed ) {
// Use the keys from $data as the titles
fputcsv($fh, array_keys($row), ";");
$headerDisplayed = true;
}
// Put the data into the stream
fputcsv($fh, $row, ";");
}
// Close the file
fclose($fh);
// Make sure nothing else is sent, our file is done
exit;
?>
include'connection.php';
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
$fileName = 'test.csv';
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename={$fileName}");
header("Expires: 0");
header("Pragma: public");
$fh = fopen( 'php://output', 'w' );
$query = "SELECT * FROM table";
$res = odbc_exec($db,$query);
$headerDisplayed = false;
// Add a header row if it hasn't been added yet
while($row = odbc_fetch_array($res)){
$i = 1; // gebruik print_r($row) om er achter te komen welke array index jouw "currency" bevat.
$row[$i] = number_format( $row[$i], 2 );
if ( !$headerDisplayed ) {
// Use the keys from $data as the titles
fputcsv($fh, array_keys($row), ";");
$headerDisplayed = true;
}
// Put the data into the stream
fputcsv($fh, $row, ";");
}
// Close the file
fclose($fh);
// Make sure nothing else is sent, our file is done
exit;
?>
Vaak is 3/4 van het werk om vragen op een forum als deze te beantwoorden het uitvogelen:
- wat iemand nu bedoelt
- wat iemand nu wil
Als dat duidelijk is geworden is het vinden van een oplossing simpelweg het extrapoleren van de verzamelde informatie...
Volgens mij wordt dit in de volksmond ook wel het opstellen van een specificatie genoemd.
Vergelijk het met het bakken van een taart. Zonder een recept wordt dat verdomd lastig en weet ik ook niet hoe deze uiteindelijk zou moeten smaken.
Alvast bedankt.
Toevoeging op 01/06/2015 09:51:01:
Ik heb het al opgelost door deze regel $row['kolom1'] = number_format( $row['kolom1'], 2, ',', ''); te herhalen voor elke kolom. Bedankt voor de hulp!
Gewijzigd op 01/06/2015 09:52:59 door Dennis B