shell實現txt轉換excel

轉自:http://hi.baidu.com/yanweinet/blog/item/71a872d743d487d8a044dfe9.html

本程序要求用於轉換的txt文本內數據用"|"線分隔,當然也可以根據自己的需要來修改,用"|"主要是因爲很多時候提取的數據是用unload語句從數據庫中提取的。
      這裏要說明的是,單靠shell程序是不可能按照excel的真正的文件格式來寫的,但是用這個程序轉換的文本是能直接用windows下的excel程序打開的。估計已能基本滿足一般的要求了。
      原理:將“|”分隔的數據最終換成以“   ”(tab製表符)分隔,文件名後綴改爲.xls即可用windows下excel程序打開了。在這個程序裏還解決了兩個問題,第一個就是以"0" 開頭的數字轉換以後用excel打開後"0"會被自動刪掉,再一個就是如果數字超過11位的長度則打開以後數據會自動用科學記數法表示。解決的辦法就是在 這類數據前加" ' "(單引號),因爲excel程序中如果在數字前加" ' "(單引號)則表示以文體格式存儲數據。後來我測試的結果是打開的時候仍然能夠看見在程序中添加的" ' "(單引號),在excel單元格雙擊這些數據後纔會變爲文本格式," ' "(單引號)消失。在我現在的應用中這也沒什麼大礙,因爲這些數據本來就是文本樣式的,不用參與做計算等,比如超過11位的一般就是身份證,以0開頭的數 據則一般是狀態標識。這樣做以後我就可以拿這個程序來做批量轉換,總比手工一個一個去用excel轉換要輕鬆的多。


shell實現txt轉換excel源程序如下:
#!/bin/sh
###############################################################################
#filename:toExcel
#功能:txt文本轉換成excel,
#   txt文本內數據以"|"分隔
#
#幫助:toExcel -help OR toExcel --help
#
#input:
#1.單個文件處理的情況(參數個數可能:1、2)
#arg1:TXTfile (必須指定一存在文件)
#arg2:XLSfile (可以是一存在的存放目錄,也可以是新的文件名,新的文件名
#可以帶後綴也可以沒有,但程序中最終會檢查是否有後綴.xls,如果沒有則
#會自動添加後綴.xls.如果這一參數是一目錄, 程序則會修改原文件名後綴後?
#作爲一新的文件名保存到指定目錄。
#這一參數也可以不用輸入,如果沒有這個參數,新的文件則保存在TXT文件目錄。
#2.批處理的情況(參數個數可能:2、3,其中第1個參數必爲"-r")
#arg1: -r (表示使用批處理)
#arg2:TXTfileDIR (該目錄必須存在要轉換的文件)
#arg3:XLSfileDIR (數據文件最終存放目錄,如果沒有這個參數則數據存放在當前目錄)
#
#注:以"0"開頭的數字 或者 長度超過11的數字,數據前加"'",
# 則數據將以文本格式保存,最終數據以製表符分隔,後綴名爲.xls
#另:轉換後的xls文件名
#重名時程序自動在新名字後加數字序號,但指定的文件名有重名則覆蓋
###############################################################################
#幫助
help()
{
cat << EOF
幫助:
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 一、單文件轉換:                                              ┃
┃     toExcel arg1 arg2                                        ┃
┃     arg1:待轉換文件                                          ┃
┃     arg2:轉換後xls文件名(可帶路徑),或xls文件存放目錄,如果 ┃
┃          這一參數爲空則表示存放目錄爲待轉換文件同一目錄,這 ┃
┃          種情況下新文件名將使用舊文件名,後綴改爲.xls。      ┃
┃ 二、批量轉換("-r"):                                          ┃
┃     toExcel -r arg1 arg2                                     ┃
┃     arg1:待轉換文件,可以是形如*.txt的表達式,也可以是一目錄 ┃
┃          (將轉換目錄下所有文件)                              ┃
┃     arg2:轉換後xls文件存放目錄,這一參數爲空則保存在待轉換文 ┃
┃          件同目錄                                            ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
EOF
}
#處理單個文件的轉換
dealone()
{
if [ $# -ne 1 ] && [ $# -ne 2 ];then
echo "/nUsage: `basename $0` TXTfile XlSfile"
echo "OR: `basename $0` TXTfile saveDIR"
echo "OR: `basename $0` TXTfile /n"
help;
return 1;
fi
#幫助
if [ $# -eq 1 ];then
if [ "$1" = "-help" ] || [ "$1" = "--help" ];then
   help;
   return 0;
fi
fi
txtfile="$1" #txt文件
if [ ! -f $txtfile ];then
echo "<ERROR>TXT文件[$txtfile]不存在!"
help;
return 1;
fi
if [ $# -eq 2 ];then
xlsfile="$2"
else
xlsfile="`dirname $txtfile`"
fi
#最終保存的EXCEL文件的文件名
if [ -d $xlsfile ];then
#刪除末尾"/"
xlsfile="`echo $xlsfile | sed 's///$//'`"
#將原文件修改後綴名爲.xls作爲最終EXCEL文件名
_tmpStr="` basename $txtfile | sed 's//.[^.]*$//' `"
_tmpStr2="$xlsfile/${_tmpStr}.xls"
#防止同名文件
i=1
while [ -f "$_tmpStr2" ]
do
   _tmpStr2="$xlsfile/${_tmpStr}($i).xls"
   i=`expr $i + 1`
done
xlsfile="$_tmpStr2"
else
#檢查上級目錄是否存在
if [ ! -d `dirname $xlsfile` ];then
   echo "<ERROR>指定文件[$xlsfile]上級目錄不存在!"
   return 1;
fi
#檢查指定名有無後綴.xls如果沒有則加上
_tmpStr="` basename $xlsfile | grep ".xls$" `"
if [ "$_tmpStr" = "" ];then
   xlsfile="${xlsfile}.xls"
fi
fi
#補齊行首和行尾的"|"
#在形如"0123"等數據前加"'",避免導入Excel後前面的"0"被刪
#在長度超過11的數字前加"'",避免導入Excel後變爲科學記數法
#刪除行首和行尾的"|"
#將"|"替換成" "(Tab)
sed 's/^[^|]/|&/g' $txtfile | sed 's/[^|] *$/&|/g' |
sed 's/| *0[0-9]/{1,/} *|/ &/g' | sed 's/| *[1-9][0-9]/{11,/} *|/ &/g' |
sed "s/ |/|/'/g" |
sed "s/^|//g" | sed "s/|$//g" |
sed 's/|/ /g' > $xlsfile
if [ $? -eq 0 ];then
echo "[$txtfile] -> [$xlsfile] OK !"
return 0;
else
echo "[$txtfile] -> [$xlsfile] ERROR !"
return 1;
fi
}
#非批量處理的參數情況
if [ $# -lt 2 ] || [ $# -gt 3 ] || [ "$1" != "-r" ];then
dealone $*
exit;
else
#批量處理的參數情況
TXTfileDIR="$2"
if [ ! -e "$TXTfileDIR" ];then
   echo "/n<ERROR>[$TXTfileDIR]不存在!/n"
   help;
   exit 1;
fi
 if [ -d "$TXTfileDIR" ];then
   TXTfileDIR="`echo $2 | sed 's///$//'`"
   if [ "`find $TXTfileDIR -type f`" = "" ];then
    echo "/n<ERROR>目錄[$TXTfileDIR]下不存在文件!/n"
    help;
    exit 1;
   fi
   TXTfileDIR="$TXTfileDIR/*"
fi
 if [ $# -eq 3 ];then
   XLSfileDIR="`echo $3 | sed 's///$//'`"
   if [ ! -d $XLSfileDIR ];then
    echo "/n<ERROR>數據存放目錄[$XLSfileDIR]不存在!/n"
    help;
    exit 1;
   fi
else
   XLSfileDIR=""
fi
fi
#批量處理,TXTfileDIR可以是存放要文件的一目錄,也可以是類似"*.txt"等 
for txt in $TXTfileDIR
do
if [ ! -f "$txt" ];then
   continue;
fi
 dealone $txt $XLSfileDIR
if [ $? -ne 0 ];then
   echo "<ERROR>[$txt] deal failed !"
fi
done
exit 0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章