iT邦幫忙

0

PHP導出csv將分隔號更改為其他

因為我的某些數據裡有包含逗號,匯出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";
	}
}
0
japhenchen
iT邦大師 1 級 ‧ 2021-06-25 10:17:45

前後加雙引號

	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."\""));
小魚 iT邦大師 1 級 ‧ 2021-06-25 12:15:53 檢舉

恩, 每個儲存格的前後加雙引號.

不好意思,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."\"");

針對會出現逗點的欄位加雙引號吧

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-06-25 10:32:37

dataProjTrialTable

1

不需要換,因為你換了還是會一樣的問題。
你將匯出的CVS想辦法做以下這些事

"這是,一個內容","123456"

也就是將各欄位用雙引號包好。

我要發表回答

立即登入回答