有没有办法通过自动 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