PHP 中的 CSV 生成文件:最后一个值被截断
CSV generated file in PHP : last value is truncated
在 CodeIgniter 2 中,我从我的 Oracle 数据库中获取数据生成一个 CSV 文件(数据量可能少于 10 行到数十万行,这就是我 "unset" 的原因每个 $line) 使用以下代码:
$conn = $this->db;
$stid = oci_parse($conn->conn_id, $sql);
oci_execute($stid);
// Header extraction
$headers = "";
$values = "";
$row = oci_fetch_array($stid, OCI_ASSOC + OCI_RETURN_NULLS );
foreach($row as $key => $value) {
$headers = $headers.$key.';';
$values = $values.$value.';';
}
// Remove of last comma and adding in a line break
$headers = substr($headers,0,-1). "\r\n";
$values = substr($values,0,-1). "\r\n";
$data = $headers . $values;
$values = "";
// Parsing all data to concatenate the values
while (($row = oci_fetch_array($stid, OCI_ASSOC + OCI_RETURN_NULLS)) != false) {
$line = "";
foreach ($row as $key => $value) {
$line .= $value . ';';
}
$line = substr($line, 0, -1) . "\n";
$data = $data . $line;
// Freeing memory for the line
unset($line);
}
return $data;
使用这段代码,我的 CSV 文件已正确生成,除了一件事。
当我只导出少量行时,一切都很好。我有所有值,所有行,逗号分隔。
但是,当我导出几百或几千行时,LAST 行的 LAST 值总是被截断 5 个字符(数据库中的数据正常)。
HEADER1;HEADER2;HEADER3;HEADER4;HEADER5
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
[.......]
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
1-XXXXXX;F1;IDX1;ERR_IDX_CAX
我以为可能是一些缓存限制什么的,但它发生在导出几百行之后,无论是几百行还是几十万行。
我搞不懂这个...
有人可以帮忙吗?
提前致谢。
此 post 中描述的原始问题与代码无关。
问题来自 CodeIgniter force_download() 函数(来自 CI 下载助手)传递的 Header 内容长度。
header("Content-Length: ".strlen($data));
strlen($data) 没有 return(在我的例子中)正确的数据长度,然后我的浏览器只下载在 header 中传递的数据量,因此在末尾截断了几个字符。
在此 "issue" 上找不到任何内容,我决定注释掉 header 内容长度行
在 CodeIgniter 2 中,我从我的 Oracle 数据库中获取数据生成一个 CSV 文件(数据量可能少于 10 行到数十万行,这就是我 "unset" 的原因每个 $line) 使用以下代码:
$conn = $this->db;
$stid = oci_parse($conn->conn_id, $sql);
oci_execute($stid);
// Header extraction
$headers = "";
$values = "";
$row = oci_fetch_array($stid, OCI_ASSOC + OCI_RETURN_NULLS );
foreach($row as $key => $value) {
$headers = $headers.$key.';';
$values = $values.$value.';';
}
// Remove of last comma and adding in a line break
$headers = substr($headers,0,-1). "\r\n";
$values = substr($values,0,-1). "\r\n";
$data = $headers . $values;
$values = "";
// Parsing all data to concatenate the values
while (($row = oci_fetch_array($stid, OCI_ASSOC + OCI_RETURN_NULLS)) != false) {
$line = "";
foreach ($row as $key => $value) {
$line .= $value . ';';
}
$line = substr($line, 0, -1) . "\n";
$data = $data . $line;
// Freeing memory for the line
unset($line);
}
return $data;
使用这段代码,我的 CSV 文件已正确生成,除了一件事。
当我只导出少量行时,一切都很好。我有所有值,所有行,逗号分隔。 但是,当我导出几百或几千行时,LAST 行的 LAST 值总是被截断 5 个字符(数据库中的数据正常)。
HEADER1;HEADER2;HEADER3;HEADER4;HEADER5
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
[.......]
1-XXXXXX;F1;IDX1;ERR_IDX_CAX_0001
1-XXXXXX;F1;IDX1;ERR_IDX_CAX
我以为可能是一些缓存限制什么的,但它发生在导出几百行之后,无论是几百行还是几十万行。
我搞不懂这个...
有人可以帮忙吗?
提前致谢。
此 post 中描述的原始问题与代码无关。
问题来自 CodeIgniter force_download() 函数(来自 CI 下载助手)传递的 Header 内容长度。
header("Content-Length: ".strlen($data));
strlen($data) 没有 return(在我的例子中)正确的数据长度,然后我的浏览器只下载在 header 中传递的数据量,因此在末尾截断了几个字符。
在此 "issue" 上找不到任何内容,我决定注释掉 header 内容长度行