R -RMySQL- 如何将更多 sql 查询保存到文件?

R -RMySQL- how to save more sql queries to file?

我在 R 中进行了一些数据分析。在脚本结束时,我想将结果保存到文件中。我知道有更多选择如何去做,但它们不能正常工作。当我尝试 sink() 它有效但它给了我:

<MySQLResult:1,5,1>
         host logname user                time                                                                       request_fline status
1 142.4.5.115      -    -  2018-01-03 12:08:58  GET /phpmyadmin?</script><script>alert('<!--VAIBS-->');</script><script> HTTP/1.1     400
                                                                size_varchar referer agent     ip_adress size_int cookie time_microsec filename
1  Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0    445      -  142.4.5.115       445     -            159        -
  request_protocol keepalive request_method contents_of_foobar contents_of_notefoobar port child_id
<MySQLResult:1,5,1>
 [1] host                   logname                user                   time                   request_fline          status                
 [7] size_varchar           referer                agent                  ip_adress              size_int               cookie                     
<0 rows> (or 0-length row.names)

这完全无法使用,因为我无法导出该类型的数据。如果我尝试 write.table 它给文件一行可以读取但是在一行 R skript 之后给我错误:Error in isOpen(file, "w") : invalid connection 并且当我尝试 write.csv 结果是相同的。当我尝试 lapply 时,它只给我一个空文件。

这是我的代码:

fileConn<-file("outputX.txt")
fileCon2<-file("outputX.csv")
sink("outputQuery.txt")
for (i in 1:length(awq)){
  sql <- paste("SELECT * FROM mtable ORDER BY cookie LIMIT ", awq[i], ",1")
  nb <- dbGetQuery(mydb, sql)
  print (nb)
  write.table(nb, file = fileConn, append = TRUE, quote = FALSE, sep = " ", eol = "\n", na = "NA", row.names = FALSE, col.names = FALSE)
  write.csv(nb, file = fileCon2,row.names=FALSE, sep="  ")
  lapply(nb, write, fileConn, append=TRUE, ncolumns=7)
  writeLines(unlist(lapply(nb, paste, collapse=" ")))
}
sink()
close(fileConn)
close(fileCon2)

我是 R 的新手,所以我不知道我还应该做什么 try.What 我想要的是 1 个文件,其中数据将以易于阅读和导出的形式打印。例如像这样:

142.4.5.115  -   -  2018-01-03 12:08:58  GET /phpmyadmin?/><!--VAIBS--> HTTP/1.1  400  Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0  445  -  142.4.5.115  445  -  145 -  HTTP/1.1  0  GET   -   -  80 7216  ?/><!--VAIBS-->   GET /phpmyadmin?/><!--VAIBS--> HTTP/1.1   -  0  /phpmyadmin   -  354 0
142.4.5.115  -   -  2018-01-03 12:10:23  GET /phpmyadmin?/><!--VAIBS--> HTTP/1.1  400  Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0  445  -  142.4.5.115  445  -  145 -  HTTP/1.1  0  GET   -   -  80 7216  ?/><!--VAIBS-->   GET /phpmyadmin?/><!--VAIBS--> HTTP/1.1   -  0  /phpmyadmin   -  354 0
142.4.5.115  -   -  2018-01-03 12:12:41  GET /phpmyadmin?/><!--VAIBS--> HTTP/1.1  400  Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0  445  -  142.4.5.115  445  -  145 -  HTTP/1.1  0  GET   -   -  80 7216  ?/><!--VAIBS-->   GET /phpmyadmin?/><!--VAIBS--> HTTP/1.1   -  0  /phpmyadmin   -  354 0
142.4.5.115  -   -  2018-01-03 12:15:29  GET /phpmyadmin?/><!--VAIBS--> HTTP/1.1  400  Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0  445  -  142.4.5.115  445  -  145 -  HTTP/1.1  0  GET   -   -  80 7216  ?/><!--VAIBS-->   GET /phpmyadmin?/><!--VAIBS--> HTTP/1.1   -  0  /phpmyadmin   -  354 0

或者这个:

host,logname,user,time, request_fline status,size_varchar,referer agent,ip_adress,size_int,cookie,time_microsec,filename,request_protocol,keepalive,request_method,contents_of_foobar,contents_of_notefoobar port child_id
1 142.4.5.115  -   -  2018-01-03 12:08:58  GET /phpmyadmin?/><!--VAIBS--> HTTP/1.1  400  Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0  445  -  142.4.5.115  445  -  145 -  HTTP/1.1  0  GET   -   -  80 7216  ?/><!--VAIBS-->   GET /phpmyadmin?/><!--VAIBS--> HTTP/1.1   -  0  /phpmyadmin   -  354 0
2 142.4.5.115  -   -  2018-01-03 12:10:23  GET /phpmyadmin?/><!--VAIBS--> HTTP/1.1  400  Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0  445  -  142.4.5.115  445  -  145 -  HTTP/1.1  0  GET   -   -  80 7216  ?/><!--VAIBS-->   GET /phpmyadmin?/><!--VAIBS--> HTTP/1.1   -  0  /phpmyadmin   -  354 0
3 142.4.5.115  -   -  2018-01-03 12:12:41  GET /phpmyadmin?/><!--VAIBS--> HTTP/1.1  400  Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0  445  -  142.4.5.115  445  -  145 -  HTTP/1.1  0  GET   -   -  80 7216  ?/><!--VAIBS-->   GET /phpmyadmin?/><!--VAIBS--> HTTP/1.1   -  0  /phpmyadmin   -  354 0
4 142.4.5.115  -   -  2018-01-03 12:15:29  GET /phpmyadmin?/><!--VAIBS--> HTTP/1.1  400  Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0  445  -  142.4.5.115  445  -  145 -  HTTP/1.1  0  GET   -   -  80 7216  ?/><!--VAIBS-->   GET /phpmyadmin?/><!--VAIBS--> HTTP/1.1   -  0  /phpmyadmin   -  354 0

或类似的东西。最重要的是,将对如何在循环中无错误地编写 write.table 提供一些帮助。但我欢迎任何功能性解决方案。我拥有的最好的是:

sql <- paste("SELECT * FROM idsaccess ORDER BY cookie LIMIT ", awq[1], ",1")
nb <- dbGetQuery(mydb, sql)
write.table(nb, file = fileConn, append = TRUE, quote = FALSE, sep = " ", eol = "\n", na = "NA", row.names = FALSE, col.names = FALSE)
fileConn<-file("outputX1.txt")
sql <- paste("SELECT * FROM idsaccess ORDER BY cookie LIMIT ", awq[2], ",1")
nb <- dbGetQuery(mydb, sql)
write.table(nb, file = fileConn, append = true, quote = FALSE, sep = " ", eol = "\n", na = "NA", row.names = FALSE, col.names = FALSE)

但这会将每个查询都交给自己的文件。而且我不希望每个查询都在自己的文件中。有什么帮助吗?

简单地将所有查询数据帧连接成一个大数据帧,因为它们都共享相同的结构,然后在一个调用中输出到文件确实是使用 write.table 或其包装器 write.csv:

的典型方式

具体来说,转for循环:

for (i in 1:length(awq)){
  sql <- paste("SELECT * FROM mtable ORDER BY cookie LIMIT ", awq[i], ",1")
  nb <- dbGetQuery(mydb, sql)
}

进入 lapply 以获得数据帧列表:

df_list <- lapply(1:length(awq), function(i) {
  sql <- paste0("SELECT * FROM mtable ORDER BY cookie LIMIT ", awq[i], ",1")
  nb <- dbGetQuery(mydb, sql)
})

然后,行绑定 do.call 将所有 dfs 堆叠到一个数据帧中并输出到文件:

final_df <- do.call(rbind, df_list)

write.table(final_df, file = "outputX.txt", append = true, quote = FALSE, sep = " ", 
            eol = "\n", na = "NA", row.names = FALSE, col.names = FALSE)