如何使用sqlldr基于头数据加载csv文件

如何使用sqlldr基于头数据加载csv文件,sql,oracle,csv,sql-loader,Sql,Oracle,Csv,Sql Loader,我有一个.csv文件,其中第一行始终包含标题信息。但是标题列的位置不是固定的。比如说, 文件1包含以下提到的数据 姓名、ID、邮寄详细信息 X,1,美国 文件2包含以下提到的数据 邮寄详细信息、姓名、ID UK,Y,10 在这里,如果我们看到列名互换,我就无法定义静态控制文件。 任何人都可以帮助我,比如如何编写控制文件来搜索标题列名并将其放入表中 我的表结构是 ID、姓名、邮寄详细信息 非常感谢。您可以尝试使用BOUNDFILLER或FILLER,如下所示 BOUNDFILLER或FILLER是

我有一个
.csv
文件,其中第一行始终包含
标题
信息。但是标题列的位置不是固定的。比如说,

文件1包含以下提到的数据

姓名、ID、邮寄详细信息

X,1,美国

文件2包含以下提到的数据

邮寄详细信息、姓名、ID

UK,Y,10

在这里,如果我们看到列名互换,我就无法定义静态控制文件。 任何人都可以帮助我,比如如何编写控制文件来搜索标题列名并将其放入表中

我的表结构是

ID、姓名、邮寄详细信息


非常感谢。

您可以尝试使用
BOUNDFILLER或FILLER
,如下所示

BOUNDFILLER或FILLER是一个数据文件映射字段,不包含 与数据库列相对应。填充字段是指定的值 从映射到的数据字段中


更多详细信息请参见

SQLLDR无法自行完成此操作

我认为你有几个选择:

  • 如果有太多的格式组合;使用脚本处理第一行并动态构建控制文件
  • 如果您的格式数量有限;使用脚本,查看第一行并将格式与控制文件匹配
  • 寻找另一个解决方案。。。抛弃SQLLDR,使用外部表

  • 假设这3列和6个组合;可以使用elsif shell脚本中的梯形图在此处框显ask

    希望这将有助于达到你想要的要求

    for file in 1.txt
    
    do
    
    f1=`head "${file}" -n1 | tr A-Z a-z | sed 's/,//g'`
    
    
    if [ $f1 == "idnamemailing_details" ] 
    then
            echo "logic 1 -> ${file}"
            echo "
            load data 
            infile '${file}' 
            badfile 'badfile1.csv'
            discardfile 'discard1.csv' 
            append
            into table schema.table
            fields terminated by ',' 
            ( id, name, mailing_details ) " > loader.ctl
            sleep 1
            sqlldr user/pwd@schema  control=loader.ctl 
            break
    
    elif [ $f1 == "idmailing_detailsname" ] 
    then
            echo "logic 2 -> ${file}"
            echo "
            load data 
            infile '${file}' 
            badfile 'badfile1.csv'
            discardfile 'discard1.csv' 
            append
            into table schema.table
            fields terminated by ',' 
            ( id, mailing_details,name ) " > loader.ctl
            sleep 1
            sqlldr user/pwd@schema  control=loader.ctl 
            break
    
    elif [ $f1 == "namemailing_detailsid" ] 
    then
            echo "logic 3 -> ${file}"
            echo "
            load data 
            infile '${file}' 
            badfile 'badfile1.csv'
            discardfile 'discard1.csv' 
            append
            into table schema.table
            fields terminated by ',' 
            ( name, mailing_details ,id) " > loader.ctl
            sleep 1
            sqlldr user/pwd@schema  control=loader.ctl 
            break
    
    elif [ $f1 == "nameidmailing_details" ] 
            then
            echo "logic 4 -> ${file}"
            echo "
            load data 
            infile '${file}' 
            badfile 'badfile1.csv'
            discardfile 'discard1.csv' 
            append
            into table schema.table
            fields terminated by ',' 
            ( name, id, mailing_details ) " > loader.ctl
            sleep 1
            sqlldr user/pwd@schema  control=loader.ctl 
            break
    
    elif [ $f1 == "mailing_detailsidname" ] 
    then
            echo "logic 5 -> ${file}"
            echo "
            load data 
            infile '${file}' 
            badfile 'badfile1.csv'
            discardfile 'discard1.csv' 
            append
            into table schema.table
            fields terminated by ',' 
            ( mailing_details,id,name ) " > loader.ctl
            sleep 1
            sqlldr user/pwd@schema  control=loader.ctl 
            break
    
    elif [ $f1 == "mailing_detailsnameid" ] 
    then
            echo "logic 6 -> ${file}"
            echo "
            load data 
            infile '${file}' 
            badfile 'badfile1.csv'
            discardfile 'discard1.csv' 
            append
            into table schema.table
            fields terminated by ',' 
            ( mailing_details, name,id  ) " > loader.ctl
            sleep 1
            sqlldr user/pwd@schema  control=loader.ctl 
            break
    
    fi
    done
    

    我们正在查看多少个这样的文件.csv?每天50多个文件有多少列的组合?BOUNDFILLER的工作方式与静态控制文件格式类似,我必须明确提到列名。因此,根据我的要求,如果我更改列顺序,那么它将不起作用。
    for file in 1.txt
    
    do
    
    f1=`head "${file}" -n1 | tr A-Z a-z | sed 's/,//g'`
    
    
    if [ $f1 == "idnamemailing_details" ] 
    then
            echo "logic 1 -> ${file}"
            echo "
            load data 
            infile '${file}' 
            badfile 'badfile1.csv'
            discardfile 'discard1.csv' 
            append
            into table schema.table
            fields terminated by ',' 
            ( id, name, mailing_details ) " > loader.ctl
            sleep 1
            sqlldr user/pwd@schema  control=loader.ctl 
            break
    
    elif [ $f1 == "idmailing_detailsname" ] 
    then
            echo "logic 2 -> ${file}"
            echo "
            load data 
            infile '${file}' 
            badfile 'badfile1.csv'
            discardfile 'discard1.csv' 
            append
            into table schema.table
            fields terminated by ',' 
            ( id, mailing_details,name ) " > loader.ctl
            sleep 1
            sqlldr user/pwd@schema  control=loader.ctl 
            break
    
    elif [ $f1 == "namemailing_detailsid" ] 
    then
            echo "logic 3 -> ${file}"
            echo "
            load data 
            infile '${file}' 
            badfile 'badfile1.csv'
            discardfile 'discard1.csv' 
            append
            into table schema.table
            fields terminated by ',' 
            ( name, mailing_details ,id) " > loader.ctl
            sleep 1
            sqlldr user/pwd@schema  control=loader.ctl 
            break
    
    elif [ $f1 == "nameidmailing_details" ] 
            then
            echo "logic 4 -> ${file}"
            echo "
            load data 
            infile '${file}' 
            badfile 'badfile1.csv'
            discardfile 'discard1.csv' 
            append
            into table schema.table
            fields terminated by ',' 
            ( name, id, mailing_details ) " > loader.ctl
            sleep 1
            sqlldr user/pwd@schema  control=loader.ctl 
            break
    
    elif [ $f1 == "mailing_detailsidname" ] 
    then
            echo "logic 5 -> ${file}"
            echo "
            load data 
            infile '${file}' 
            badfile 'badfile1.csv'
            discardfile 'discard1.csv' 
            append
            into table schema.table
            fields terminated by ',' 
            ( mailing_details,id,name ) " > loader.ctl
            sleep 1
            sqlldr user/pwd@schema  control=loader.ctl 
            break
    
    elif [ $f1 == "mailing_detailsnameid" ] 
    then
            echo "logic 6 -> ${file}"
            echo "
            load data 
            infile '${file}' 
            badfile 'badfile1.csv'
            discardfile 'discard1.csv' 
            append
            into table schema.table
            fields terminated by ',' 
            ( mailing_details, name,id  ) " > loader.ctl
            sleep 1
            sqlldr user/pwd@schema  control=loader.ctl 
            break
    
    fi
    done