$num_column = mysql_num_fields($view);
$csv_header = '';
for($i = 0; $i < $num_column; $i++) {
$csv_header .= '"' . mysql_field_name($view,$i) . '";';
}
$csv_header .= "\r\n";
$csv_row = '';
while($row = mysql_fetch_row($view)) {
for($i = 0; $i < $num_column; $i++) {
$csv_row .= '"' . $row[$i] . '";';
}
$csv_row .= "\r\n";
}
我目前正在PHPMyadmin上的存储过程中创建一个CSV文件。 这是我创建导出文件的代码段。
我希望将小数分隔符用作逗号,例如(1,45)和千位分隔符作为小数点,例如(14.124)。
我知道number_format函数,但我不确定如何将它应用于我生成的CSV导出中的所有数字。
答案 0 :(得分:1)
我将假设您希望在PHP中而不是在存储过程中执行此操作。
首先要做的事情是:不要使用mysql_ *函数。它们在PHP 5中被弃用,并且在PHP 7中被完全删除 - 这是有充分理由的。查看mysqli或PDO。如果您不熟悉PHP中的OOP,它可能看起来有点令人困惑,但它与mysql_ *函数实际上并没有太大区别。
除此之外,我建议在输出时通过函数运行每个值。您可以将该函数格式设置为看起来像数字的任何内容,或者使用白名单来格式化您知道数字的特定列。
以下是全包功能示例 - 您可以将其修剪为您需要的功能。它允许您传递要格式化的值,以及列名的可选参数,以及应格式化为数字的列数组的另一个可选参数。
function format_number_output ($val, $col=false, $whitelist=array())
{
// First, check if the column name was passed
if ($col !== false && count($whitelist) > 0)
{
// Is this one of the columns that should be formatted?
if (in_array($col, $whitelist) && is_numeric($val))
{return number_format($val, 2, ',', '.');}
// If not, then just return the original value
else
{return $val;}
}
// If the column name was not passed, then format anything that looks like a number
else if (is_numeric($val))
{return number_format($val, 2, ',', '.');}
// Otherwise, just return the original value
else
{return $val;}
}
你可以用不同的选项测试它:
// Returns "1234.56":
print format_number_output("1234.56", "actually_text", array("numeric_field", "another_numeric"));
// Returns "1.234,56":
print format_number_output("1234.56", "numeric_field", array("numeric_field", "another_numeric"));
// Returns "text":
print format_number_output("text", "numeric_field", array("numeric_field", "another_numeric"));
// Returns "1.234,56":
print format_number_output("1234.56");
// Returns "text":
print format_number_output("text");
此外,我强烈建议您接受GrumpyCrouton的建议并使用fputcsv
。 CSV格式有许多你不想处理的愚蠢的小问题。
你可以修改你的代码让它像这样工作(我已经离开了你的mysql_fetch_array调用 - 但是再次,在你的项目变大并且重构变得困难之前,学会尽快使用PDO / mysqli):
$fp = fopen("output.csv", "w");
while($row = mysql_fetch_row($view)) {
$cur_row = array();
for($i = 0; $i < $num_column; $i++) {
$cur_row[] = format_number_output($row[$i]);
}
fputcsv($fp, $cur_row);
}
fclose($fp)
如果你想使用白名单方法,你可以使用mysql_fetch_array(或者更确切地说 - 相当于PDO / mysqli)获取列名:
$fp = fopen("output.csv", "w");
while($row = mysql_fetch_array($view)) {
$cur_row = array();
foreach ($row as $col=>$val) {
$cur_row[] = format_number_output($val, $col, array("numeric_field", "another_numeric_field"));
}
fputcsv($fp, $cur_row);
}
fclose($fp)