#!/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 |