php對csv檔案的常用操作集合
1.CSV的讀取操作
1.
<?php
2.
$file
=
fopen
(
'D:/file.csv'
,
'r'
);
3.
while
(
$data
=
fgetcsv
(
$file
))
{
//每次讀取CSV裡面的一行內容
4.
print_r(
$data
);
//此為一個數組,要獲得每一個數據,訪問陣列下標即可
5.
} fclose(
$file
);
?>
2.CSV的寫入操作
1.
<?php
2.
$fp
=
fopen
(
'd:/file/file.csv'
,
'w'
);
3.
fputcsv
(
$fp
,
array
(
'aaa'
,
'bbb'
,
'cccc'
));
4.
fputcsv
(
$fp
,
array
(
'mmm'
,
'yyy'
,
'haha'
));
//fputcsv可以用陣列迴圈的方式進行實現
5.
fclose(
$fp
);
6.
?>
3.輸出CSV(下載功能)
01.
<?php
02.
header(
"Content-Type: text/csv"
);
03.
header(
"Content-Disposition:
attachment; filename=test.csv"
);
04.
header(
'Cache-Control:must-revalidate,post-check=0,pre-check=0'
);
05.
header(
'Expires:0'
);
06.
header(
'Pragma:public'
);
07.
echo
"id,areaCode,areaName\n"
;
08.
echo
"1,cn,china\n"
;
09.
echo
"2,us,America\n"
;
10.
?>
php中解析和生成逗號分隔的資料(CSV資料)
在php中你想把資料格式轉化為逗號分隔的值(Comma-separted values, CSV),以便匯入到電子表格或者資料庫被其他php程式所使用。
首先我們考慮php生成CSV資料,使用fputcsv()函式生成一行CSV格式的資料。看以下的例項:
01.
<?php
02.
$strs
=
array
(
03.
array
(
'php中解析CSV資料'
,
'2010-02-01′,
'
fputcsv
', '
jwork' ),
04.
array
(
'php中生成CSV資料'
,
'2010-02-01′,
'
fgetcsv
', '
jwork' ),
05.
array
(
'php中使用流操作'
,
'2010-02-01′,
'
php:
//output', 'jwork' )
06.
);
07.
$fp
=
fopen
(
'str.csv'
,
'w'
)
or
die
(
'Can\'t
open str.csv'
);
08.
foreach
(
$strs
as
$str_line
)
{
09.
if
(
fputcsv
(
$fp
,
$str_line
)
=== false ) {
10.
die
(
'Can\'t
write CSV line.'
);
11.
}
12.
}
13.
fclose(
$fp
)
or
die
(
'Can\'t
close str.csv'
);
14.
?>
這個php程式碼寫入檔案str.csv的資料就是CSV資料。
如果想輸出CSV格式的資料而不是將其寫入到一個檔案中,可以使用特殊的輸出流–php://output
例: 將CSV資料存放在一個字串中
01.
<?php
02.
$strs
=
array
(
03.
array
(
'php中解析CSV資料'
,
'2010-02-01′,
'
fputcsv
', '
jwork' ),
04.
array
(
'php中生成CSV資料'
,
'2010-02-01′,
'
fgetcsv
', '
jwork' ),
05.
array
(
'php中使用流操作'
,
'2010-02-01′,
'
php:
//output', 'jwork' )
06.
);
07.
ob_start();
08.
$fp
=
fopen
(
,
'w'
)
or
die
(
);
09.
foreach
(
$strs
as
$str_line
)
{
10.
if
(
fputcsv
(
$fp
,
$str_line
)
=== false ) {
11.
die
(
'Can\'t
write CSV line'
);
12.
}
13.
}
14.
fclose(
$fp
)
or
die
(
);
15.
$output
= ob_get_contents();
16.
ob_end_clean();
17.
echo
$output
;
//
$output為CSV資料的字串
18.
?>
在php中解析CSV資料,例如,一個由Excel或者資料庫匯出的檔案,想把這些記錄和欄位抽取成一種可以在php處理的資料格式。
如果CSV資料包含在一個檔案中,先用fopen()開啟這個檔案,然後使用fgetcsv()函式讀取其中的資料。
例:php從檔案中讀取CSV資料
01.
<?php
02.
$fp
=
fopen
(
'sample.csv'
,
'r'
)
or
die
(
'Can\'t
open file'
);
03.
// 二維陣列 第一維表示每行資料 第二維表示每行中每個欄位的值
04.
$arr
=
array
();
05.
while
(
$csv_line
=
fgetcsv
(
$fp
)
) {
06.
$arr_tmp
=
array
();
07.
for
(
$i
=
0;
$i
<
count
(
$csv_line
);
$i
++
) {
08.
$arr_tmp
[
$i
]
=
$csv_line
[
$i
];
09.
}
10.
array_push
(
$arr
,
$arr_tmp
);
11.
}
12.
print_r(
$arr
);
13.
?>
在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檔案。然後會提示使用者下載此檔案。
01.
<?php
02.
$table
=
'table_name'
;
03.
$outstr
= NULL;
04.
header(
"Content-Type: application/csv"
);
05.
header(
"Content-Disposition:
attachment;Filename=cars-models.csv"
);
06.
$conn
= mysql教程_connect(
"localhost"
,
"mysql_user"
,
"mysql_password"
);
07.
mysql_select_db(
"db"
,
$conn
);
08.
// Query database to get column names
09.
$result
= mysql_query(
"show
columns from $table"
,
$conn
);
10.
// Write column names
11.
while
(
$row
=
mysql_fetch_array(
$result
)){
12.
$outstr
.=
$row
[
'Field'
].
','
;
13.
}
14.
$outstr
=
substr
(
$outstr
,
0, -1).
"n"
;
15.
// Query database to get data
16.
$result
= mysql_query(
"select
* from $table"
,
$conn
);
17.
// Write data rows
18.
while
(
$row
=
mysql_fetch_assoc(
$result
)) {
19.
$outstr
.= join(
','
,
$row
).
"n"
;
20.
}
21.
echo
$outstr
;
22.
mysql_close(
$conn
);
23.
?>
24.
25.
方法2 - 使用
fputcsv
()
26.
27.
在
fputcsv
()函式格式作為CSV行並將其寫入一個開啟的檔案。欲瞭解更多資訊,看
28.
29.
一看http:
//php.net/manual/en/function.fputcsv.php看看。
30.
31.
下面的程式碼片斷建立一個指定表的列名,包括CSV檔案,並將其傳送到瀏覽器。
32.
[code]
33.
<?php
34.
$table
=
'table_name'
;
35.
$filename
= tempnam(sys_get_temp_dir(),
"csv"
);
36.
$conn
= mysql_connect(
"localhost"
,
"mysql_user"
,
"mysql_password"
);
37.
mysql_select_db(
"db"
,
$conn
);
38.
$file
=
fopen
(
$filename
,
"w"
);
39.
// Write column names
40.
$result
= mysql_query(
"show
columns from $table"
,
$conn
);
41.
for
(
$i
=
0;
$i
< mysql_num_rows(
$result
);
$i
++)
{
42.
$colArray
[
$i
]
= mysql_fetch_assoc(
$result
);
43.
$fieldArray
[
$i
]
=
$colArray
[
$i
][
'Field'
];
44.
}
45.
fputcsv
(
$file
,
$fieldArray
);
46.
// Write data rows
47.
$result
= mysql_query(
"select
* from $table"
,
$conn
);
48.
for
(
$i
=
0;
$i
< mysql_num_rows(
$result
);
$i
++)
{
49.
$dataArray
[
$i
]
= mysql_fetch_assoc(
$result
);
50.
}
51.
foreach
(
$dataArray
as
$line
)
{
52.
fputcsv
(
$file
,
$line
);
53.
}
54.
fclose(
$file
);
55.
header(
"Content-Type: application/csv"
);
56.
header(
"Content-Disposition:
attachment;Filename=cars-models.csv"
);
57.
// send file to browser
58.
readfile(
$filename
);
59.
unlink(
$filename
);
60.
?>
[/code]