【问题标题】:Array values and insert in ksh数组值并插入 ksh
【发布时间】:2013-05-25 20:26:30
【问题描述】:

我有一个数组,它返回从文件中读取的表的data_type。例如:

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 的一部分。


哦,好的,现在我明白了.. 谢谢!但是..如果我的数组是这样的:

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
}

?

【问题讨论】:

    标签: arrays shell unix ksh


    【解决方案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
    

    【讨论】:

    • 现在我试试看。但是你能解释一下这个功能吗?具体做什么?
    • 它说:field1:指定的数字对该命令无效。
    • 首先,告诉我你在这里有什么:“我有一个数组,它返回从文件中读取的表的 data_type。” -- ksh 脚本中有数组变量吗?
    【解决方案2】:

    嗯,首先,我使用线轴进行了选择,以提取我需要的内容。然后我以这种方式从从线轴创建的文件中创建了数组:

    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}
    

    【讨论】:

      猜你喜欢
      • 2014-12-10
      • 2018-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多