DBM資料匯入到mysql資料庫方法

來源:互聯網
上載者:User

首先說明一下,我以前使用PERL,儲存檔案 用DBM資料庫,有5萬多條記錄,每條記錄有15個欄位。現在想用MYSQL,要吧記錄導過來。
第一步,將所有的DBM記錄匯入到了一個文字檔,每個欄位之間用TAB分開(就是"t"),每條記錄換行結束。
第二部,將資料讀入數組,並且開啟資料庫和定義預先處理如下:

 代碼如下 複製代碼

<?php
$dbline=file("g:/allrecord.txt");  //將資料庫記錄讀入到數組
$collen=array(8,50,80,20,20,30,3,20,1,1,20,35,35,35,2); #表裡面每個欄位的長度數值

$db=new mysqli('localhost','me','mypass','allrecdb');
if(mysqli_connect_errno()) {
    echo "Can not connect db!";
    exit;
}
$q->query("SET names 'gb2312'");

$q="INSERT INTO customers VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

$s=$db->prepare($q); #預定義插入記錄

//


資料庫有15個欄位,為了方便匯入,已經設定全部類型為CHAR,長度從1到100不等,具體等同$collen的數值;
並且沒有任何欄位設定UNIQUE或者PRIMARY KEY;
在命令列用INSERT命令插入記錄成功
//

 代碼如下 複製代碼
foreach($dbline as $line) {
    $rec=explode("t",trim($line));
    //這裡反覆測試過,$rec數組有15個值,並且我都把它strval了
    //    for($j=0;$j<count($rec);$j++) {
        $rec[$j]=substr($rec[$j],0,$collen[$j]);
    }
    for($i=0;$i<count($rec);$i++) {
        $rec[$i]=strval($rec[$i]);
    }
    $s->bind_param("sssssssssssssss",$rec[0],$rec[1],$rec[2],$rec[3],$rec[4],$rec[5],$rec[6],$rec[7],$rec[8],$rec[9],$rec[10],$rec[11],$rec[12],$rec[13],$rec[14]);
     $s->execute();
}
$s->close();
$db->close();
?>


經過幾個小時的調試,發現任何字串超過欄位長度就不能添加,所以做了如下處理。
1) 先把每個記錄的每個欄位的長度進行了處理,代碼如下:
 

 代碼如下 複製代碼
   for($j=0;$j<count($rec);$j++) {
        $rec[$j]=substr($rec[$j],0,$collen[$j]);
    }

2)再處理插入

 代碼如下 複製代碼
$s->bind_param("sssssssssssssss",$rec[0],$rec[1],$rec[2],$rec[3],$rec[4],$rec[5],$rec[6],$rec[7],$rec[8],$rec[9],$rec[10],$rec[11],$rec[12],$rec[13],$rec[14]);

     $s->execute();
這樣就可以插入記錄了。


目前剩下的問題是,任何帶有漢字的記錄,都不能插入(在命令列可以)。
查了資料,在命令列alter  database crm character set 'gb2312',在指令碼查詢前加入$db->query("SET names 'gb2312'")
都沒用。
也沒找到my.ini去改default-character-set=gb2312
難道php5.5暫時不支援中文?

MYSQL太多稀奇古怪的提示,解決不了問題,所有裝上了SQLITE,在命令列匯入文本記錄,發現了問題:

1)某些欄位中存在分行符號,但是在任何文本編譯器中不換行或者不顯示。這樣會在匯入的時候,1行變成2行,列參數自然不對了。
解決方案: 用str_replace($line,char(13));把每行內的分行符號替換掉,然後把所有記錄存入tmp.txt

2)再進行命令列的匯入

 代碼如下 複製代碼
sqlite3>.import tmp.txt customers
sqlite3>select count(*) from cusomers;

57491

顯示匯入成功。

可見,大量匯入的時候,一定要處理好那些隱藏的特殊字元。
由於時間關係,沒有測試MYSQL的情況。晚上有空再確認一下同樣方案是否可行。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.