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

Posted

技术标签:

【中文标题】从一个非常大的 MySQL 转储文件中以 csv 格式获取数据【英文标题】:Get data as csv from a very large MySQL dump file 【发布时间】:2021-02-09 11:13:57 【问题描述】:

我有一个 .sql 格式的 mysql 转储文件。它的大小约为 100GB。 int 中只有两个表。我必须使用 Python 或 Bash 从这个文件中提取数据。问题是插入语句包含所有数据并且该行太长。因此,正常做法会导致内存问题,因为该行(即所有数据)也在循环中加载。

是否有任何有效的方法或工具可以将数据获取为 CSV?

只是一点解释。以下行包含实际数据,并且非常大。

INSERT INTO `tblEmployee` VALUES (1,'Nirali','Upadhyay',NULL,NULL,9,'2021-02-08'),(2,'Nirali','Upadhyay',NULL,NULL,9,'2021-02-08'),(3,'Nirali','Upadhyay',NULL,NULL,9,'2021-02-08'),....

问题是由于资源问题,我无法将其导入 MySQL。

【问题讨论】:

一个高效的工具是 MySQL。见:How to output MySQL query results in CSV format? 是否有任何有效的方法或工具可以将数据以 CSV 格式获取? 直接从 .SQL 中获取数据,无需导入数据?删除所有直到第一个((含),然后将所有),( 替换为CR,忽略最后);(含)之后的所有...仅此而已。 如前所述,我不能为此使用 MySQL。我必须通过 Bash 或 Python 解析它 这可能会有所帮助:Export a MySQL Database to SQLite Database 【参考方案1】:

我不确定这是否是您想要的,但pandas 具有将 sql 转换为 csv 的功能。试试这个:

import pandas as pd
import sqlite3

connect = sqlite3.connect("connections.db")
cursor = connect.cursor()
                    
# save sqlite table in a DataFrame
dataframe = pd.read_sql(f'SELECT * FROM table', connect)
# write DataFrame to CSV file

dataframe.to_csv("filename.csv", index = False)

connect.commit()
connect.close()

如果您想更改分隔符,您可以执行 dataframe.to_csv("filename.csv", index = False, sep='3') 并将 '3' 更改为您选择的分隔符。

【讨论】:

在某些(百万)条记录之后会导致内存问题。

以上是关于从一个非常大的 MySQL 转储文件中以 csv 格式获取数据的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 php 从一个非常大的 csv 文件中只读取 1000 条记录?

如何从一个非常大的仓库中获取项目的 svn 转储

如何根据日期列在不同的文本/csv文件中转储一个巨大的mysql表?

mysql 从远程数据库转储到本地主机输出文件

Impala:从 mysql 转储创建镶木地板

分段错误:从文件访问 csv 记录时核心转储