【问题标题】:export very large sql file into csv with Python or R使用 Python 或 R 将非常大的 sql 文件导出到 csv
【发布时间】: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)。 ..你知道我应该怎么做吗?

标签: python sql r csv export


【解决方案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')
    猜你喜欢
    • 2016-03-20
    • 2013-05-17
    • 2012-01-09
    • 2014-12-17
    • 1970-01-01
    • 2013-05-07
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多