2013-05-30 82 views
1

我有一個數組,它返回從文件中讀取的表的data_type。例如:數組值並插入ksh

filed1 VARCHAR2 
filed2 INTEGER 

現在我要做的insert在同一個表進行備份。所以我想出了這個這個過程是動態的:

ENDROW="" 
while read ENDROW; 
do 
    tmp=${ENDROW##*@#;} 
      field1=`printf "%s\n" "${tmp%%@#;*}"` 
    tmp=${ENDROW##*@#;} 
      field2=`printf "%s\n" "${tmp%%@#;*}"` 

    *and here the insert in the table* 
done 

我創建數組,因爲我需要它來尋找各領域的data_type,所以我能理解,如果值需要引用('')或不。我怎樣才能「連接」數組呢? shell將能夠理解該數組的第一個值是VARCHAR2並且引用''作爲insert的一部分。


噢現在我明白了..謝謝! However..if我的數組是這樣的:

field1    VARCHAR2 
field2    NUMBER 
field3    VARCHAR2 
field4    DATE 
field5    TIMESTAMP(6) 
field6    DATE 
field7    DATE 
field8    CHAR 

的功能將是:

function format { 
case "${typeof[$1]}" in 
    VARCHAR2) printf '"%s"\n' "$2" ;; 
    NUMBER) printf "%d\n" "$2" ;; 
    DATE) printf "%d\n" "$2" ;; 
    CHAR) printf "%d\n" "$2" ;; 
    *) print -u2 "don't know about field '$1'" ;; 
    esac 
} 

回答

1

我會做這樣的事情 - 我假設你有一個名爲typeof一個數組,字段名映射到數據類型:

function format { 
    case "${typeof[$1]}" in 
     VARCHAR2) printf '"%s"\n' "$2" ;; 
     INTEGER) printf "%d\n" "$2" ;; 
     *) print -u2 "don't know about field '$1'" ;; 
    esac 
} 

while read ENDROW; 
do 
    tmp=${ENDROW##*@#;} 
    field1=$(format field1 "${tmp%%@#;*}") 
    tmp=${ENDROW##*@#;} 
    field2=$(format field2 "${tmp%%@#;*}") 
    # and here the insert in the table 
done 
+0

現在我試試它..但你能解釋我的功能嗎?什麼exacly做? –

+0

它說:field1:指定的號碼對此命令無效。 –

+0

首先,告訴我你在這裏的含義:「我有一個數組,它返回從文件中讀取的表的data_type。」 - 你有一個數組變量在ksh腳本中? –

0

好,首先我做了一個線軸的選擇提取我需要的東西。然後,我從從卷軸以這種方式創建的文件中的數組:

i=0 
while read str 
do 
arr[$((i=i+1))]=$str 
done < ${file} 

數組包含:

field1    VARCHAR2 
field2    NUMBER 
field3    VARCHAR2 
field4    DATE 
field5    TIMESTAMP(6) 
field6    DATE 
field7    DATE 
field8    CHAR 

好嗎?


我想陣列將是:

arr[field1]="VARCHAR2" 
arr[field2]="NUMBER" 
arr[field3]="VARCHAR2" 
arr[field4]="DATE" 
arr[field5]="TIMESTAMP(6)" 
arr[field6]="DATE" 
arr[field7]="DATE" 
arr[field8]="CHAR" 

這是一個關聯數組,使用字符串而不是整數作爲索引的。你會做

typeset -A arr 
while read key value; do 
    arr[$key]=$value 
done < ${file} 
+0

我的方式不正確? –