2011-12-10 93 views
4

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

在这里,我尝试了一些伪代码来证明什么,我猜的代码可能看起来像,大致为:

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?

编辑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") 
+0

你在使用什么SQL服务器?大多数提供出口功能,我认为在你的具体情况下,速度会快得多。 – UnhandledExcepSean

+0

MySQL。我唯一的GUI界面是SequelPro。 – sckott

+0

对,我可以出口,但是我必须过滤物种,然后出口,然后做2000次,这有点多。 – sckott

回答

1

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

+0

好的。我希望有一个R的解决方案,从R调用MySQL,但我应该学习适合这个特定问题的语言。 – sckott

+0

如果您对R感到满意,请使用R.我知道有一个R的postgres接口,也可能有一个mysql接口。只要发布你已有的内容,人们可以通过R部分或sql部分或界面部分来帮助你。为了您的理智:以“只读”的形式访问数据库,或在数据库的副本上工作,或确保您有备份。 – wildplasser

+0

这是我从Rrequire(RMySQL)的工作流程;需要(plyr) drv < - dbDriver(“MySQL”) con <-dbConnect(drv,user =“asdfaf”,dbname =“test”,host =“localhost”) splist < - read.csv(“ splist_use。CSV “) sqlwrite < - 函数(spname){ 猫(spname) G1 < - dbGetQuery(CON, 糊(” 选择col_16,col_18 FROM DAT WHERE col_11 =”',spname, “'”,九月= “)) write.csv(g1,paste(spname,”.csv“,sep =”“)) rm(”g1“) } l_ply(splist,sqlwrite,.progress =”text“) – sckott

0

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

在Excel 到数据标签 从其他渠道选择 选择和输入连接 从这里的首选方法,你可以定义一个表或查询运行。 (如果结果小于表格中支持的Excel版本的行数),那么使用您选择的方法将提取文件。应该比现在做的IO更快。

+0

有趣。我不知道这是可能的。我已经使用了PHP/MySQL解决方案,但这是一个很好的替代解决方案。 – sckott

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挑出每个唯一的物种名称,循环遍历结果并输出到一个唯一的csv文件。

你应该在你的查询中有一个order by子句

+0

哦,很酷,谢谢你的提示。我从朋友那里找到了一个PHP和MySQL的解决方案,但这很好。 – sckott

相关问题