首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将csv格式的数据从内存发送到数据库,而不将csv保存到磁盘?

如何将csv格式的数据从内存发送到数据库,而不将csv保存到磁盘?
EN

Stack Overflow用户
提问于 2017-08-16 17:06:56
回答 1查看 310关注 0票数 4

我正在建立一个从Quandl收集数据并将其存储在数据库中的系统。我应该注意的是,我的工作没有商业方面(我没有客户/雇主)。我这样做是一种爱好,希望能学到一两样东西。

无论如何,我给自己设置的挑战是构建一个系统,自动从Quandl下载数据并将其存储在数据库中,而不将zip或csv文件保存到磁盘中。

昆德尔提供每日的“增量”文件,这些文件可以作为zip文件下载。压缩文件被解压缩到csv文件。我已经成功地下载了压缩文件,并在内存中提取了csv文件,使用了MemoryStream、ZipArchive和.Net中的StreamReader (特别是,如果需要的话,F#很乐意提供代码片段)。

现在,我面临的挑战是如何将这些信息转移到我的数据库中。我使用的数据库是MariaDB (本质上与MySQL相同)。我之所以使用它,是因为这是NAS支持的唯一类型的数据库。

备选方案如下

  1. 放弃不保存到磁盘并将csv保存到磁盘的目标,然后像在这个答案中那样将文件路径传递给存储过程。
  2. 我可以将csv数据转换为JSON或XML,并将其传递给存储过程,并让服务器将字符串解析为tempory表。在使用Server之前,我已经这样做了,并且在这里假设类似的事情是可能的。
  3. 逐行读取csv并逐行传递到数据库。这确实是一个不可选择的选择,因为它将非常缓慢。

看来2是我所知道的最好的选择。是否有更直接的方法不涉及将csv转换为JSON或XML?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-16 17:29:19

到目前为止,LOAD DATA INFILE将是最快的一条路。但它确实要求您将CSV数据放入文件系统。您可能有一个临时的,甚至是一个RAM,文件系统在您的设置中这样做。

在dotnet世界中,有一个从流中读取CSV数据的健壮模块。文件是流的特例。出于历史原因,该模块名为Microsoft.VisualBasic.FileIO.TextFieldParser。(它在Visual之外运行得很好,它只是很久以前就有了一个名字。)

如果使用这种方法,可以通过在每个事务中插入CSV的多行来提高性能。有两种方法可以做到这一点。

一个是多行插入,如下所示

代码语言:javascript
运行
复制
     INSERT INTO tbl 
     (col,col,col)
     VALUES 
     (val, val, val),
     (val, val, val),
     (val, val, val),
     ...
     (val, val, val);

另一种方法是使用START TRANSACTION,然后执行几百个插入,然后执行COMMIT,然后重复到完成为止。经验教给你,这将使你的插入相当快。

在MySQL存储过程中解析JSON?令人难以置信的难以调试。而且,正如我提到的,您仍然需要管理这些事务。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45719328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档