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

Posted

技术标签:

【中文标题】使用 Python 或 R 将非常大的 sql 文件导出到 csv【英文标题】:export very large sql file into csv with Python or R 【发布时间】:2016-02-01 17:04:26 【问题描述】:

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

问题是:到目前为止,我使用 Python 在网上找到的解决方案 (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 中)

非常感谢任何帮助!

【问题讨论】:

你能发布你的 sql 文件的一小部分(非常小)吗?如果可能的话,还有你的 Python 或 R 代码 不幸的是我不能发布任何子集。但该文件包含各种变量(时间戳、带有任何字符的字符串(可能还有一些中文、数字等)。 @dickoa 看到我上面的编辑。谢谢! 您可以使用“编辑”按钮将代码粘贴到问题上,我认为在问题上更好。如果您不能发布文件的任何子集,那么 sql 文件的示例将帮助人们尝试回答和帮助您。 @dickoa 我正在尝试您的方法,但我收到以下错误 unicodeencodeerror: 'ascii' codec can't encode charater u'\xee' in position 1: ordinal not in range (128)。 ..你知道我应该怎么做吗? 【参考方案1】:

mysql数据库中加载.sql文件并导出为CSV。

在 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>;

【讨论】:

【参考方案2】:

在 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 &lt; run

【讨论】:

感谢 grothendieck,但您的解决方案对我来说有点太复杂了。如何用windows创建文件?我需要管理员权限吗(我没有)。为什么这个解决方案会克服我上面解释的问题?谢谢!! 您可以使用记事本创建文件,或者根本无法创建文件,只需手动将行键入 sqlite3。您不需要管理员权限。【参考方案3】:

您可以批量读取 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()

【讨论】:

我没有测试过代码,如果有什么问题请告诉我。 当然,不用担心。我会让你知道。再次感谢! 我正在尝试您的方法,但我收到以下错误 unicodeencodeerror: 'ascii' codec can't encode character u'\xee' in position 1: ordinal not in range (128)...你知道我该怎么做吗? 试试df.to_csv(f, header=False, encoding='utf-8')

以上是关于使用 Python 或 R 将非常大的 sql 文件导出到 csv的主要内容,如果未能解决你的问题,请参考以下文章

Excel 到 SQL - 非常大的文件

如何在python中解析非常大的文件?

读取大文件的最佳方式(例如非常大的文本文档)

管理非常大的 SQL 查询

从一个非常大的 MySQL 转储文件中以 csv 格式获取数据

在 java 中解析非常大的 XML 文档(以及更多)