SQL循环读取,然后将数据写入文件

时间:2011-12-10 23:50:12

标签: mysql sql r plyr

我有一个拥有5700万行和23列的数据集。有一个列有不同鸟类的物种名称(约2000个唯一名称),我想为每个独特的物种名称提取两列数据(纬度,经度),并写入每个列的纬度/经度数据。物种,物种名称作为文件名。这是我知道的唯一语言R需要很长时间。适合这项任务的代码是什么?

我在这里尝试一些伪代码来演示我猜测的代码可能是什么样的,粗略地说:

FOR i IN 1:unique(species_name)
    SELECT latitude,longitude WHERE species_name=[i]
    WRITE [some code that writes a text file with species name as the file name]
LOOP END;

我想我可以在OSX上的Terminal做这种事情吗?

编辑20111211: 这是我在R的工作流程:

 require(RMySQL);
 require(plyr)
 drv <- dbDriver("MySQL")
 con <- dbConnect(drv, user = "asdfaf", dbname = "test", host = "localhost")
 splist <- read.csv("splist_use.csv")
 sqlwrite <- function(spname) {
   cat(spname) g1 <- dbGetQuery(con
     , paste("SELECT col_16,col_18 FROM dat WHERE col_11='"
     , spname, "'", sep="")
     )
   write.csv(g1, paste(spname, ".csv", sep=""))
   rm("g1") }
 l_ply(splist, sqlwrite, .progress="text" )

3 个答案:

答案 0 :(得分:1)

恕我直言,你能做的最好的事情是使用脚本语言(python,perl,php,shell)并从那里生成文件名和查询。这不是太难,但你必须学习不同的语言。 SQL不适合命令式编程。

答案 1 :(得分:1)

您是否尝试过使用MySQL outfile功能?

SELECT col_16,col_18 
FROM 
dat 
WHERE col_11= spiecesname
INTO OUTFILE '/tmp/spiecesname.csb'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

通过一些工作,您可以让MySQL选择每个唯一的Species名称,循环结果并输出到唯一的csv文件。

您的查询应该有一个order by子句

答案 2 :(得分:0)

是一个可接受的Excel文件输出,你有excel吗?如果是这样,您可以使用Excel连接到数据库,并发出查询以提取数据。它是在.xls或csv中。格式。但是,假设您的结果小于1,000,000。

在excel中 转到数据选项卡 从其他来源中选择 选择并输入首选连接方法 从这里,您可以定义要运行的表或查询。 (如果结果小于您所使用的Excel版本的工作表支持的行数),则使用您选择的方法将提取文件。应该比你目前正在做的IO更快。