在php中你想把数据格式花为逗号分隔的值(Comma-separted values, CSV),以便导入到电子表格或者数据库
被其他php程序所使用。
首先我们考虑php生成CSV数据,使用fputcsv()函数生成一行CSV格式的数据。看以下的实例:
$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数据存放在一个
$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数据
$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
$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程序避免这些不明显的错误。