日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

用shell編出來的查看dbf文件的腳本


不是很完善,但還行了,速度稍慢!
#!/bin/ksh
hd -abdA $1 |sed -n "1p" | cut -c7-70>$HOME/tmp/FIRSTLINE$$
DBFFLAG=`awk "{print $1}" $HOME/tmp/FIRSTLINE$$`
if [ $DBFFLAG -ne 3 ]
then
echo "這不是一個數(shù)據(jù)庫文件!aa"
exit 1
fi
DEFSIZE=`awk "{print ($9 $10*256)}" $HOME/tmp/FIRSTLINE$$`
STEP=`awk "{print ($11 $12*256)}" $HOME/tmp/FIRSTLINE$$`
dd if=$1 of=$HOME/tmp/DBFEND$$ bs=$DEFSIZE skip=1 2>/dev/null
fold -b -w$STEP $HOME/tmp/DBFEND$$
rm $HOME/tmp/FIRSTLINE$$
rm $HOME/tmp/DBFEND$$

DBF結(jié)構(gòu)的一般描述如下(這是低版本,foxpro 2.6以下可用,高的版本我不是很清楚):【用shell編出來的查看dbf文件的腳本】第1個字節(jié):DBF的標志,若含有Memory字段則為80H,否則為03H,這是以下的一個判斷的一個根據(jù)來的;
2-4字節(jié):文件建立或修改的最后日期(年、月、日);
5-8字節(jié):數(shù)據(jù)庫記錄個數(shù),低位在前,高位在后 。
9-10字節(jié):指出了庫說明部分的實際長度,庫說明部分的實際長度=第10字節(jié)的值*256 第四字節(jié)的值;
11-12字節(jié):每條記錄的長度=第12字節(jié)的值*256 第11字節(jié)的值;
13-32字節(jié):未用 。庫說明部分從第33個字節(jié)開始,依次存放每個字段結(jié)構(gòu)的說明,每32個字節(jié)描述一個字段,具體內(nèi)容這個腳本沒有用到,就不說了,想知道了在網(wǎng)上狗一下就可以找到,#!/bin/ksh
#以上這句不用解釋了吧 。hd -abdA $1 |sed -n "1p" | cut -c7-70>$HOME/tmp/FIRSTLINE$$
#hd就作用就是以十六進制格式顯示文件,那些參數(shù)是什么意思,自己man一下就知道了,而sed -n "1p"就是取其中的第一行,沒法,這里對于大的文件要浪費一點時間,因為他要顯示整個文件,然后才取第一行嘛;而cut -c7-70就是取DBF文件的前16個字節(jié)的那些ASCII的十六進值,而不是原來的文件ASCII字符,這也是最重要的一部分,有了這部分,“下面的問題就容易多了”!一句話,取DBF的文件頭的十六進制字串 。DBFFLAG=`awk "{print $1}" $HOME/tmp/FIRSTLINE$$`
#取第一個字節(jié)的ASCII值,作為判斷是不是DBF文件的標志 。if [ $DBFFLAG -ne 3 ]
then
echo "這不是一個數(shù)據(jù)庫文件!aa"
exit 1
fi
#判斷一下,要是數(shù)據(jù)庫文件的話就進下面的工作,要不是的話,就退出,這里忽略掉一個問題,要是有備注字段的話,也當該文件為一個非數(shù)據(jù)庫文件,因為那種情況要復(fù)雜一些;曾有人問道,aa是什么意思?意思是響鈴,BELL 。
DEFSIZE=`awk "{print ($9 $10*256)}" $HOME/tmp/FIRSTLINE$$`
#按部就班,取出庫說明部分的實際長度 。define sizeSTEP=`awk "{print ($11 $12*256)}" $HOME/tmp/FIRSTLINE$$`
#取出每條記錄的長度,要是沒有這個的話,就不能準確定義什么時候換行了!dd if=$1 of=$HOME/tmp/DBFEND$$ bs=$DEFSIZE skip=1 2>/dev/null
#到這里,我們就可以取出“戲肉”了,不要前面的說明部分,只保留其中的真正的數(shù)據(jù)部分,bs就是block size,也就是用dd,以每塊為define size的長度去復(fù)制到另一個文件,skip=1就是不要第一塊(即說明部分),留下主要的數(shù)據(jù)部分 。因為dd會有系統(tǒng)提示信息出來的,故用2>/dev/null過濾掉 。fold -b -w$STEP $HOME/tmp/DBFEND$$
#因為剛才得到的是一個連續(xù)的文本,沒有換行的,而fold 就是實現(xiàn)換行的作用的 。這里沒有重定向,也就是我們在屏幕看到的了 。rm $HOME/tmp/FIRSTLINE$$
rm $HOME/tmp/DBFEND$$
#這個也要說嗎?就是刪除臨時文件 ?!?$"就是當前進程的進程號,這樣做的原因就是:要是一個很大的數(shù)據(jù)庫在顯示時,這個程序相對C編的文件要慢很多,其產(chǎn)生的臨時文件也會停留一段時間,而多個數(shù)據(jù)庫文件同時顯示時,如果是同一臨時文件名的話,那就會產(chǎn)生不可預(yù)料的結(jié)果!我之所以認為這個腳本慢的原因就是,取文件頭的時候,要過一遍整個文件,去除文件頭又要過一遍,加換行符時又要過一遍,一共是三遍??!要是誰有更好的方法,請不吝賜教!wy2k@sina.com

推薦閱讀