phpmyadmin 導(dǎo)入 csv 的用戶界面如下圖:
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),永州企業(yè)網(wǎng)站建設(shè),永州品牌網(wǎng)站建設(shè),網(wǎng)站定制,永州網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,永州網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
以下是相關(guān)的注意事項(xiàng)及說明:
1、關(guān)于 CSV 和 CSV using LOAD DATA
這兩種都可以導(dǎo)入CSV格式的文件數(shù)據(jù),區(qū)別在于:當(dāng)文件比較大時(shí)用 CSV 可能 script 會(huì)超時(shí),這時(shí)就得使用 LOAD DATA。
2、列名
列名就是你在導(dǎo)出時(shí)打鉤的“將字段名稱放在首行”,實(shí)際就是用分隔符分開的字段名集合,就是填寫所有字段名,中間用分隔字段的字符隔開。
3、Ignore duplicate rows
這個(gè)選項(xiàng)的作用是忽略相同的行,意為相同的行只導(dǎo)入一行數(shù)據(jù)。4、轉(zhuǎn)義字段的字符是指數(shù)據(jù)里面可能含有特殊字符串,如分隔字段的字符、包裹字段的字符還有SQL保留字符,這些得先轉(zhuǎn)義否則會(huì)出錯(cuò),按默認(rèn)的設(shè)置是沒什么問題的。
php讀取csv文件,在windows上出現(xiàn)中文讀取不到的情況,本人立馬想到一個(gè)函數(shù)mb_convert_encoding();作如下設(shè)置 $str = mb_convert_encoding($str, "UTF-8", "GBK");然后就可以了。當(dāng)然你也可以用iconv();作如下設(shè)置iconv(‘GBK’,”UTF-8//TRANSLIT//IGNORE”,$str);這兩個(gè)函數(shù)來解決在windows上面發(fā)生亂碼的問題。
php導(dǎo)入CSV文件:
$line_number = 0;
$handle = fopen("1.xls","r");
while ($data = fgetcsv ($handle, 100000, ",")) {
if($line_number == 0){
$line_number++;
continue;
}
//z這樣就可以去掉表頭的那一行
for ($i = 0; $i count($data); $i++) {
$ziduan = $data[$i];
}
}
2.php導(dǎo)出CSV文件
header( "Cache-Control: public" );
header( "Pragma: public" );
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:attachment;filename=txxx.csv");
header('Content-Type:APPLICATION/OCTET-STREAM');
ob_start();
$header_str = ?iconv("utf-8",'gbk',"信息id,標(biāo)題,名稱,電話,QQ,Email,內(nèi)容,時(shí)間\n");
$file_str="";
$mysqli= new mysqli('localhost','root','','test');
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$sql='select * ?from messages';
$mysqli-query("set names utf8 ;");
$result=$mysqli-query($sql);
if($result){
while ($row = mysqli_fetch_assoc($result)){
$file_str.= $row['id'].','.$row['title'].','.$row['name'].','."'{$row['telephone']}'".','.$row['qq'].','.$row['email'].','.str_ireplace(',',',',$row['content']).','.$row['retime']."\n";
}
}else{
echo "nonono!!!";
}
$file_str= ?iconv("utf-8",'gbk',$file_str);
ob_end_clean();
echo $header_str;
echo $file_str;
?
在使用PhpMyAdmin的時(shí)候經(jīng)常用到數(shù)據(jù)的導(dǎo)入和導(dǎo)出(Export/Import),但是在導(dǎo)入大數(shù)據(jù)的時(shí)候由于php上傳文件的限制和腳本響應(yīng)時(shí)間的限制,導(dǎo)致phpMyAdmin無法導(dǎo)入大數(shù)據(jù)。很多時(shí)候都是由于文件過大,從本地瀏覽上傳導(dǎo)入,容易中斷失敗,有沒有更好的方法呢?
方法:
在phpMyAdmin的目錄下,找到根目錄的config.inc.php文件,
打開config.inc.php文件,查找$cfg['UploadDir'],這個(gè)參數(shù)就是設(shè)定導(dǎo)入文件存放的目錄,這里把值設(shè)定為:ImportSQLFile。
在phpMyAdmin目錄下,建立以ImportSQLFile命名的文件夾,
把我們需要導(dǎo)入的數(shù)據(jù)文件,放到ImportSQLFile文件夾下面,非常簡(jiǎn)單,
登入phpMyAdmin,選擇需要導(dǎo)入的數(shù)據(jù),點(diǎn)擊導(dǎo)航條上面的“導(dǎo)入”按鈕,
選中“從網(wǎng)站服務(wù)器上傳文件夾ImportSQLFile/中選擇:”選項(xiàng),并需要導(dǎo)入的數(shù)據(jù)文件,
最后點(diǎn)擊“執(zhí)行”,即可導(dǎo)入成功。
注意事項(xiàng)
如果在config.inc.php文件,沒有找到$cfg['UploadDir'],可以自己在文件中添加上去即可。
思路:
讀取csv文件,每讀取一行數(shù)據(jù),就插入數(shù)據(jù)庫
示例
文件夾結(jié)構(gòu)
/
file.csv????//csv大文件,這里只模擬三行數(shù)據(jù),不考慮運(yùn)行效率(PS:csv文件格式很簡(jiǎn)單,文件一般較小,解析很快,運(yùn)行效率的瓶頸主要在寫入數(shù)據(jù)庫操作)
index.php????//php文件
file.csv
singi,20
lily,19
daming,23
index.php
/**
*?讀取csv文件,每讀取一行數(shù)據(jù),就插入數(shù)據(jù)庫
*/
//獲取數(shù)據(jù)庫實(shí)例
$dsn?=?'mysql:dbname=test;host=127.0.0.1';
$user?=?'root';
$password?=?'';
try?{
$db?=?new?PDO($dsn,?$user,?$password);
}?catch?(PDOException?$e)?{
echo?'Connection?failed:?'?.?$e-getMessage();
}
//讀取file.csv文件
if?(($handle?=?fopen("file.csv",?"r"))?!==?FALSE)?{
while?(($row?=?fgetcsv($handle,?1000,?","))?!==?FALSE)?{
//寫入數(shù)據(jù)庫
$sth?=?$db-prepare('insert?into?test?set?name=:name,age=:age');
$sth-bindParam(':name',$row[0],PDO::PARAM_STR,255);
$sth-bindParam(':age',$row[1],PDO::PARAM_INT);
$sth-execute();
}
fclose($handle);
}
數(shù)據(jù)表
CREATE?TABLE?`test`?(
`id`?INT(10)?UNSIGNED?NOT?NULL?AUTO_INCREMENT,
`name`?VARCHAR(255)?NULL?DEFAULT?''?COLLATE?'utf8mb4_bin',
`age`?INT(10)?NULL?DEFAULT?'0',
PRIMARY?KEY?(`id`)
)
COLLATE='utf8mb4_bin'
ENGINE=InnoDB;
運(yùn)行結(jié)束后,數(shù)據(jù)庫中會(huì)插入csv中的三行數(shù)據(jù)
//這是我前幾天回答過的一個(gè)問題下面以讀取淘寶csv文件為例
if($result){????????//如果上傳成功了,這是文件路徑
if?(!($handle?=?fopen_utf8($result,?"r"))?===?FALSE){??//調(diào)取下邊函數(shù)fopen_utf8;
$errorArr?=?array();
$i=0;
while?(($cols?=?fgetcsv($handle,?1000,?"\t"))?!==?FALSE)?{??
++$i;
if($i4)?continue;
$taobaolmsx?=?$cols[21];//寶貝屬性;
$taobaoxxsx?=?$cols[30];//銷售屬性;
$goodsBn?=?$cols[33];//商家編碼;
}??
fclose($handle);???????????????????????
}
unlink($result);
}else{
echo?'file?upload?error';exit;
}
/*讀取csv文件用?*/
function?fopen_utf8($filename){??
$encoding='';??
$handle?=?fopen($filename,?'r');??
$bom?=?fread($handle,?2);??
rewind($handle);??
if($bom?===?chr(0xff).chr(0xfe)??||?$bom?===?chr(0xfe).chr(0xff)){??
//?UTF16?Byte?Order?Mark?present??
$encoding?=?'UTF-16';??
}?else?{??
$file_sample?=?fread($handle,?1000)?+?'e';?//read?first?1000?bytes??
//?+?e?is?a?workaround?for?mb_string?bug??
rewind($handle);??
$encoding?=?mb_detect_encoding($file_sample?,?'UTF-8,?UTF-7,?ASCII,?EUC-JP,SJIS,?eucJP-win,?SJIS-win,?JIS,?ISO-2022-JP');??
}??
if?($encoding){??
stream_filter_append($handle,?'convert.iconv.'.$encoding.'/UTF-8');??
}??
return??($handle);??
}