使用Python或R将非常大的sql文件导出到csv中

时间:2015-11-01 20:47:41

标签: python sql r csv export

我有一个大型的sql文件(20 GB),我想将其转换为csv。我计划将文件加载到Stata进行分析。我有足够的RAM来加载整个文件(我的电脑在RAM中有32GB)

问题是:到目前为止我在网上找到的解决方案(sqlite3)似乎需要比现有系统更多的RAM:

  • 阅读SQL
  • 写csv

这是代码

import sqlite3
import pandas as pd

con=sqlite3.connect('mydata.sql')
query='select * from mydata'
data=pd.read_sql(query,con)
data.to_csv('export.csv')
con.close()

sql文件包含大约15个变量,可以是时间戳,字符串或数值。没什么好看的。

我认为一种可能的解决方案是读取sql并一次写一行csv文件。但是,我不知道如何做到这一点(无论是在R中还是在Python中)

任何帮助真的很感激!

3 个答案:

答案 0 :(得分:11)

您可以批量读取SQL数据库并将其写入文件,而不是一次读取整个数据库。感谢How to add pandas data to an existing csv file?了解如何添加到现有CSV文件。

import sqlite3
import pandas as pd

# Open the file
f = open('output.csv', 'w')
# Create a connection and get a cursor
connection = sqlite3.connect('mydata.sql')
cursor = connection.cursor()
# Execute the query
cursor.execute('select * from mydata')
# Get data in batches
while True:
    # Read the data
    df = pd.DataFrame(cursor.fetchmany(1000))
    # We are done if there are no data
    if len(df) == 0:
        break
    # Let's write to the file
    else:
        df.to_csv(f, header=False)

# Clean up
f.close()
cursor.close()
connection.close()

答案 1 :(得分:4)

使用Windows cmd行或UNIX shell中的sqlite3命令行程序:

sqlite3 -csv "mydata.sql" "select * from mydata;" > mydata.csv

如果mydata.sql不在当前目录中,请使用路径,在Windows上使用正斜杠而不是反斜杠。

交替运行sqlite3

sqlite3

并在sqlite提示符处输入以下命令:

.open "mydata.sql"
.ouptut mydata.csv
.mode csv
select * from mydata;
.quit

(或者将它们放在名为run的文件中,然后使用sqlite3 < run

答案 2 :(得分:2)

.sql文件加载到mysql数据库并将其导出为CSV格式。

Commans在MySQL数据库中加载mysql转储文件。

创建MySQL数据库

create database <database_name>

mysqldump -u root -p <database_name> < dumpfilename.sql

将MySQL表导出为CSV

的命令
mysql -u root -p
use <database_name>

SELECT * INTO OUTFILE 'file.csv'
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
FROM <table_name>;