因為我的某些數據裡有包含逗號,匯出csv他會跑到下個欄位,因次我想把分隔符號改成其他符號,但不知如何改,請大家幫忙,謝謝!
if (isset($_POST["export"])) {
setlocale(LC_ALL, 'zh_TW');
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=' . str_replace("/", "", $g_proj) . '_' . date("Ymd_His") . '.csv');
header('Pragma: no-cache');
echo "\xEF\xBB\xBF";
$ttype = $_GET["tt"];
$year = $_GET["y"];
$month = $_GET["m"];
if ($ttype == "1") {
$header = array('給號時間', '訂單編號', '委刊單編號', '廣告主', '活動名稱', '委刊公司', '行業別', '組別', '負責業務', '預算', '計價方式');
} else if ($ttype == "2") {
$header = array('給號時間', '訂單編號', '委刊單編號', '廣告主', '活動名稱', '委刊公司', '行業別', '組別', '負責業務', '異動單內控編號', '計價方式', '異動分類', '異動原因');
} else if ($ttype == "4") {
$header = array('稽核時間', '訂單編號', '委刊單編號', '廣告主', '活動名稱', '委刊公司', '行業別', '組別', '負責業務', '計價方式', '客訴原預算', '客訴價格', '客訴分類', '客訴原因');
}
$g_db->where("agree", "Y");
$g_db->where("ttype", $ttype);
$g_db->where("reason", "已取號");
if (isset($year) && isset($month)) {
$g_db->where("YEAR(audit_time) = " . $year);
$g_db->where("MONTH(audit_time) = " . $month);
} else {
$g_db->where("YEAR(audit_time) = YEAR(CURRENT_DATE - INTERVAL " . $last_month . " MONTH)");
$g_db->where("MONTH(audit_time) = MONTH(CURRENT_DATE - INTERVAL " . $last_month . " MONTH)");
}
$g_db->orderBy("audit_time", "asc");
$a_ad_audit = $g_db->get("ad_audit");
$k = 0;
for ($i = 0; $i < sizeof($a_ad_audit); $i++) {
$idad_proj_trial = $a_ad_audit[$i]['idad_proj_trial'];
$idad_proj = $a_ad_audit[$i]['idad_proj'];
$g_db->where("idad_proj", $idad_proj);
$a_ad_proj = $g_db->getOne("ad_proj");
if ($a_ad_proj['proj_type'] != "1" && $ttype == "1") {
$g_db->where("idad_proj", $a_ad_proj['idad_proj']);
$g_db->where("ttype", "1");
$g_db->orderBy("idad_proj_trial", "asc");
$first_trial = $g_db->getValue("ad_proj_trial", "idad_proj_trial");
if ($first_trial != $idad_proj_trial) {
continue;
}
}
array_push($data, dataProjTrialTable($a_ad_audit[$i]['audit_time'], $idad_proj, $idad_proj_trial));
$k++;
}
echo
preg_replace(
"/[\[\]\"]/",
"",
json_encode(
$header,
JSON_UNESCAPED_UNICODE
)
);
echo "\n";
$pattean = array("/[a-z]/", "/[\[\]\"]/");
$replace = array("", "");
foreach ($data as $line) {
$str1 =
str_replace(
"\\",
"",
json_encode(
$line,
JSON_UNESCAPED_UNICODE
)
);
echo
preg_replace(
$pattean,
$replace,
$str1
);
echo "\n";
}
}
前後加雙引號
foreach ($data as $line) {
$str1 =
str_replace(
"\\",
"",
json_encode(
$line,
JSON_UNESCAPED_UNICODE
)
);
echo
"\"" .
preg_replace(
$pattean,
$replace,
$str1
) . "\"";
echo "\n";
}
這樣匯出的資料會變都在同一欄位裡面
哇哩,我沒看到 as $line
那你要在array_push時就加雙引號
array_push($data, dataProjTrialTable($a_ad_audit[$i]['audit_time'], "\"".$idad_proj."\"", "\"".$idad_proj_trial."\""));
恩, 每個儲存格的前後加雙引號.
不好意思,j大,這樣跑出來的結果好像怪怪的,我附上dataProjTrialTable的程式碼,這樣應該要怎麼加雙引號好呢?
if (!function_exists('dataProjTrialTable')) {
function dataProjTrialTable($audit_time, $p_idad_proj, $p_idad_proj_trial)
{
global $g_db;
global $a_ad_proj;
global $g_industry;
global $ttype;
global $g_cust_price_type;
$stack = array($audit_time);
array_push($stack, $a_ad_proj["proj_id"]);
array_push($stack, $a_ad_proj["proj_icno"]);
if ($a_ad_proj['cust_buyer'] != "")
array_push($stack, $a_ad_proj["cust_buyer"]);
else {
$g_db->where("idad_customer", $a_ad_proj['idad_cust_buyer']);
$a_ad_customer = $g_db->getOne("ad_customer");
array_push($stack, $a_ad_customer["name"]);
}
if ($a_ad_proj['proj_type'] != 1)
echo "*";
array_push($stack, $a_ad_proj["proj_name"]);
$g_db->where("idad_customer", $a_ad_proj['idad_customer']);
$a_ad_customer = $g_db->getOne("ad_customer");
array_push($stack, $a_ad_customer["name"]);
array_push($stack, $g_industry[$a_ad_proj["class"]]);
$g_db->where("idad_user", $a_ad_proj['idad_user']);
$a_ad_user = $g_db->getOne("ad_user");
array_push($stack, $a_ad_user['team']);
array_push($stack, $a_ad_user['name']);
if (!isset($ttype) || $ttype == "1") {
array_push($stack, $a_ad_proj["budget"]);
} else if ($ttype == "2") {
$g_db->where("idad_proj_trial", $p_idad_proj_trial);
$a_ad_modify = $g_db->getOne("ad_modify");
array_push($stack, $a_ad_modify['ad_modify_icno']);
} else if ($ttype == "4") {
$g_db->where("idad_proj_trial", $p_idad_proj_trial);
$a_ad_complaint = $g_db->getOne("ad_complaint");
array_push($stack, "");
} else
array_push($stack, "");
array_push($stack, $g_cust_price_type[$a_ad_proj["cust_price_type"]]);
if ($ttype == "2") {
include "../inc/inc_modify_reason.php";
$a_modify_type = explode(",", $a_ad_modify['modify_type']);
$sumChar = "";
for ($i = 0; $i < sizeof($a_modify_type); $i++) {
if ($a_modify_type[$i] == "")
continue;
$sumChar = $sumChar . $v_modify_type[$a_modify_type[$i]] . " ";
}
array_push($stack, $sumChar);
array_push($stack, $a_ad_modify['reason']);
}
return $stack;
}
}
你在這種加入陣列的指令裡加就對了
array_push($stack, "\"" . $a_ad_modify['reason'] . "\"");
數量蠻多的,你自己手動加一下吧
加了還是一樣耶...沒有改變
赫!用文字編輯器看一下CSV內容,是否都有雙引號
我想請問像這個加雙引號是跑不出內容的,應該怎麼加好呢?
if ($ttype == "2") {
include "../inc/inc_modify_reason.php";
$a_modify_type = explode(",", $a_ad_modify['modify_type']);
$sumChar = "";
for ($i = 0; $i < sizeof($a_modify_type); $i++) {
if ($a_modify_type[$i] == "")
continue;
$sumChar = $sumChar . $v_modify_type[$a_modify_type[$i]] . " ";
}
array_push($stack, "\"".$sumChar."\"");
針對會出現逗點的欄位加雙引號吧
不需要換,因為你換了還是會一樣的問題。
你將匯出的CVS想辦法做以下這些事
"這是,一個內容","123456"
也就是將各欄位用雙引號包好。