有没有办法通过自动 table 创建将 CSV 导入 Oracle DB?使用突击队
Is there a way to import a CSV to Oracle DB with automatic table creation? Using commando line
我正在寻找一种无需在导入前手动创建 table 即可将 CSV 导入 Oracle DB 的方法。有人知道解决方案吗?
那是我与预定义 table 一起使用的代码,它是 .ctl-File 的一部分并与 SQL 加载程序一起使用。是否可以修改它来解决问题?
load data
infile 'D:/random.csv'
into table konten
fields terminated by ';'
(kontonummer,firmenname,inhaber,rechtsform,email,kontostand)
试试 csv2db。
生成 选项将为您创建 table。
# https://github.com/csv2db/csv2db
# drop user
echo 'drop user csvdata cascade;' | sqlplus -S system/oracle@localhost:1521/XEPDB1
# create user and grant privileges
sqlplus -S system/oracle@localhost:1521/XEPDB1 <<EOF
create user csvdata identified by load default tablespace USERS temporary tablespace TEMP quota unlimited on USERS;
grant create session, resource to csvdata;
EOF
# generate DDL
time csv2db generate --file=movies.csv --table=MOVIES | sed 's/1000/4000/' \
| sqlplus -S csvdata/load@localhost:1521/XEPDB1
# load data
time csv2db load --user=csvdata --password=load --host=localhost --port=1521 --dbname=XEPDB1 \
--separator=',' --table=MOVIES --directpath \
--file=movies.csv
# what do we have?
echo 'select count(*) from movies;' | sqlplus -S csvdata/load@localhost:1521/XEPDB1
祝你好运!
一个选项是使用 read_csv [=27 的函数=] 是 python 语言的库,用于数据操作和分析如
import pandas as pd
import cx_Oracle
user = 'hr'
password = 'hr'
host = '192.168.56.102'
port = '1521'
dbname = 'myOracleDB'
con = cx_Oracle.connect(user, password, host+':'+port+'/'+dbname)
cur = con.cursor()
tab_name = 'konten'
cur.execute('SELECT COUNT(*) FROM user_tables WHERE table_name = UPPER(:1) ',[tab_name])
exs = cur.fetchone()[0]
df = pd.read_csv(r'D:\random.csv')
col=df.columns[0].split(";")
crt=""
for k in col:
crt += ''.join(k)+' VARCHAR2(4000),'
if int(exs) == 0:
crt = 'CREATE TABLE '+tab_name+' ('+crt.rstrip(",")+')'
cur.execute(crt)
vrs=""
for i in range(0,len(col)):
vrs+= ':'+str(i+1)+','
cols=[]
sql = 'INSERT INTO '+tab_name+' VALUES('+vrs.rstrip(",")+')'
for i in range(0,len(df)):
cols.append(df.values[i][0].split(";"))
cur.executemany(sql,cols)
con.commit()
cur.close
我正在寻找一种无需在导入前手动创建 table 即可将 CSV 导入 Oracle DB 的方法。有人知道解决方案吗? 那是我与预定义 table 一起使用的代码,它是 .ctl-File 的一部分并与 SQL 加载程序一起使用。是否可以修改它来解决问题?
load data
infile 'D:/random.csv'
into table konten
fields terminated by ';'
(kontonummer,firmenname,inhaber,rechtsform,email,kontostand)
试试 csv2db。
生成 选项将为您创建 table。
# https://github.com/csv2db/csv2db
# drop user
echo 'drop user csvdata cascade;' | sqlplus -S system/oracle@localhost:1521/XEPDB1
# create user and grant privileges
sqlplus -S system/oracle@localhost:1521/XEPDB1 <<EOF
create user csvdata identified by load default tablespace USERS temporary tablespace TEMP quota unlimited on USERS;
grant create session, resource to csvdata;
EOF
# generate DDL
time csv2db generate --file=movies.csv --table=MOVIES | sed 's/1000/4000/' \
| sqlplus -S csvdata/load@localhost:1521/XEPDB1
# load data
time csv2db load --user=csvdata --password=load --host=localhost --port=1521 --dbname=XEPDB1 \
--separator=',' --table=MOVIES --directpath \
--file=movies.csv
# what do we have?
echo 'select count(*) from movies;' | sqlplus -S csvdata/load@localhost:1521/XEPDB1
祝你好运!
一个选项是使用 read_csv [=27 的函数=] 是 python 语言的库,用于数据操作和分析如
import pandas as pd
import cx_Oracle
user = 'hr'
password = 'hr'
host = '192.168.56.102'
port = '1521'
dbname = 'myOracleDB'
con = cx_Oracle.connect(user, password, host+':'+port+'/'+dbname)
cur = con.cursor()
tab_name = 'konten'
cur.execute('SELECT COUNT(*) FROM user_tables WHERE table_name = UPPER(:1) ',[tab_name])
exs = cur.fetchone()[0]
df = pd.read_csv(r'D:\random.csv')
col=df.columns[0].split(";")
crt=""
for k in col:
crt += ''.join(k)+' VARCHAR2(4000),'
if int(exs) == 0:
crt = 'CREATE TABLE '+tab_name+' ('+crt.rstrip(",")+')'
cur.execute(crt)
vrs=""
for i in range(0,len(col)):
vrs+= ':'+str(i+1)+','
cols=[]
sql = 'INSERT INTO '+tab_name+' VALUES('+vrs.rstrip(",")+')'
for i in range(0,len(df)):
cols.append(df.values[i][0].split(";"))
cur.executemany(sql,cols)
con.commit()
cur.close