php对csv文件的常用操作集合

没有评论

2011 年 02 月 12 日 at 下午 9:31分类:PHP | WEB开发

1.CSV的读取操作

<?php
$file = fopen('D:/file.csv','r');
 while ($data = fgetcsv($file)) {//每次读取CSV里面的一行内容
print_r($data); //此为一个数组,要获得每一个数据,访问数组下标即可
}     fclose($file);    ?>

2.CSV的写入操作

<?php   
 $fp = fopen('d:/file/file.csv', 'w');   
 fputcsv($fp,array('aaa','bbb','cccc'));   
 fputcsv($fp,array('mmm','yyy','haha'));   //fputcsv可以用数组循环的方式进行实现   
 fclose($fp);   
 ?>  

3.输出CSV(下载功能)

<?php   
 header("Content-Type: text/csv");   
 header("Content-Disposition: attachment; filename=test.csv");   
 header('Cache-Control:must-revalidate,post-check=0,pre-check=0');   
 header('Expires:0');   
 header('Pragma:public');   
 echo "id,areaCode,areaName\n";   
 echo "1,cn,china\n";   
 echo "2,us,America\n";
?>

php中解析和生成逗号分隔的数据(CSV数据)

在php中你想把数据格式转化为逗号分隔的值(Comma-separted values, CSV),以便导入到电子表格或者数据库被其他php程序所使用。

首先我们考虑php生成CSV数据,使用fputcsv()函数生成一行CSV格式的数据。看以下的实例:

<?php
$strs = array(
 array( 'php中解析CSV数据', '2010-02-01′, 'fputcsv', 'jwork' ),
 array( 'php中生成CSV数据', '2010-02-01′, 'fgetcsv', 'jwork' ),
 array( 'php中使用流操作', '2010-02-01′, 'php://output', 'jwork' )
);
$fp = fopen( 'str.csv', 'w' ) or die( 'Can\'t open str.csv' );
foreach ( $strs as $str_line ) {
 if ( fputcsv( $fp, $str_line ) === false ) {
 die( 'Can\'t write CSV line.' );
 }
}
fclose( $fp ) or die( 'Can\'t close str.csv' );
?>

这个php代码写入文件str.csv的数据就是CSV数据。
如果想输出CSV格式的数据而不是将其写入到一个文件中,可以使用特殊的输出流–php://output
例: 将CSV数据存放在一个字符串中

<?php
$strs = array(
 array( 'php中解析CSV数据', '2010-02-01′, 'fputcsv', 'jwork' ),
 array( 'php中生成CSV数据', '2010-02-01′, 'fgetcsv', 'jwork' ),
 array( 'php中使用流操作', '2010-02-01′, 'php://output', 'jwork' )
);
ob_start();
$fp = fopen( 'php://output', 'w' ) or die( 'Can\'t open php://output' );
foreach( $strs as $str_line ) {
 if ( fputcsv( $fp, $str_line ) === false ) {
 die( 'Can\'t write CSV line' );
 }
}
fclose( $fp ) or die( 'Can\'t close php://output' );
$output = ob_get_contents();
ob_end_clean();
echo $output;   // $output为CSV数据的字符串
?>

在php中解析CSV数据,例如,一个由Excel或者数据库导出的文件,想把这些记录和字段抽取成一种可以在php处理的数据格式。
如果CSV数据包含在一个文件中,先用fopen()打开这个文件,然后使用fgetcsv()函数读取其中的数据。
例:php从文件中读取CSV数据

<?php
$fp = fopen( 'sample.csv', 'r' ) or die( 'Can\'t open file' );
// 二维数组 第一维表示每行数据 第二维表示每行中每个字段的值
$arr = array();
while ( $csv_line = fgetcsv( $fp ) ) {
 $arr_tmp = array();
 for( $i = 0; $i < count( $csv_line ); $i++ ) {
 $arr_tmp[$i] = $csv_line[$i];
 }
 array_push( $arr, $arr_tmp );
}
print_r( $arr );
?>

在PHP4中,必须为fgetcsv()提供第二个参数,这个参数是一个大于CSV文件中最大一个行长度的值(行尾的空白符计算在内)。在PHP5中,这个表示行长度的参数变成了可选择的。如果不指定这个参数,fgetcsv()函数会度取一整行的数据(在PHP5.0.4及以后的版本中,将此参数设置为0也会达到同样的效果)。当平均的行长度超过8192字节时,如果你指定了一个明确的行长度,而不是让PHP自己去计算的话,那么PHP程序运行速度会加快。

fgetcsv()函数的第三个参数可以用户替代逗号作为数据的分隔符。不过使用其他的分隔符会令CSV格式作为表列数据交换的一种简便途径的效果稍微打一些折扣。

不要试图绕过fgetcsv()函数,只用读取一行然后使用explode()按逗号进行解析。CSV的实际情况要比这种方式能够处理的格式更复杂,比如说某些字段值中包含逗号直接量,不应该将字段中包含的逗号当成是字段的分隔符。使用fgetcsv()可以保证你和你的PHP程序避免这些不明显的错误。

如何创建一个CSV文件

方法1 – 使用HTTP头

至于在Word和Excel,您需要添加头信息到PHP脚本的例子。

下面的代码片断创建一个指定的表包括其列名CSV文件。然后会提示用户下载此文件。

<?php
$table = 'table_name';
$outstr = NULL;
header("Content-Type: application/csv");
header("Content-Disposition: attachment;Filename=cars-models.csv");
$conn = mysql教程_connect("localhost", "mysql_user", "mysql_password");
mysql_select_db("db",$conn);
// Query database to get column names  
$result = mysql_query("show columns from $table",$conn);
// Write column names
while($row = mysql_fetch_array($result)){
 $outstr.= $row['Field'].',';
}  
$outstr = substr($outstr, 0, -1)."n";
// Query database to get data
$result = mysql_query("select * from $table",$conn);
// Write data rows
while ($row = mysql_fetch_assoc($result)) {
 $outstr.= join(',', $row)."n";
}
echo $outstr;
mysql_close($conn);
?>

方法2 - 使用fputcsv()

在fputcsv()函数格式作为CSV行并将其写入一个打开的文件。欲了解更多信息,看

一看http://php.net/manual/en/function.fputcsv.php看看。

下面的代码片断创建一个指定表的列名,包括CSV文件,并将其发送到浏览器。
[code]
<?php 
$table = 'table_name';
$filename = tempnam(sys_get_temp_dir(), "csv");
$conn = mysql_connect("localhost", "mysql_user", "mysql_password");
mysql_select_db("db",$conn);
$file = fopen($filename,"w");
// Write column names
$result = mysql_query("show columns from $table",$conn);
for ($i = 0; $i < mysql_num_rows($result); $i++) {
 $colArray[$i] = mysql_fetch_assoc($result);
 $fieldArray[$i] = $colArray[$i]['Field'];
}
fputcsv($file,$fieldArray);
// Write data rows
$result = mysql_query("select * from $table",$conn);
for ($i = 0; $i < mysql_num_rows($result); $i++) {
 $dataArray[$i] = mysql_fetch_assoc($result);
}
foreach ($dataArray as $line) {
 fputcsv($file,$line);
}
fclose($file);
header("Content-Type: application/csv");
header("Content-Disposition: attachment;Filename=cars-models.csv");
// send file to browser
readfile($filename);
unlink($filename);
?>

[/code]