如何使用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无法自行完成此操作 我认为你有几个选择:
假设这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