【问题标题】:How to extract the content of SQL-Files using R?如何使用 R 提取 SQL 文件的内容?
【发布时间】:2016-01-29 13:13:21
【问题描述】:

我有一个充满sqlstatements 的同事的文件夹/目录。该文件夹也由他每天更新。我想为期货同事记录这些sqlstatements。但是,我正在寻找一种“自动化”该过程的方法。 我想过每周使用一次crontab 并运行一个R-Markdown 文件,它会自动更新现有的R-Markdown 文件。

我的做法如下:

path = "c:/SQL_files/"
out.file<-""
file.names <- dir(path, pattern =".sql") # here I changed `.txt` to `.sql`
for(i in 1:length(file.names)){
file <- read.csv2.sql(file.names[i],header=TRUE, sep=";",    stringsAsFactors=FALSE)
  out.file <- rbind(out.file, file)
}


# That second approach comes very close, but just generates a `.txt` for the first
#`.sql` file in the directory with the error:

   Error in match.names(clabs, names(xi)) : 
   names do not match previous names 

文件在哪里:

 [1] "c:/SQL_files/first.sql"                                            
 [2] "c:/SQL_files/second.sql"     

 path = "c:/SQL_files/"
 out.file<-""
files <- list.files(path=path, pattern="*.sql", full.names=T, recursive=FALSE)
for(i in 1:length(files)){
  file <- read.table(files[i],header=TRUE, sep=";", stringsAsFactors=FALSE)
  out.file <- rbind(out.file, file)
}

提取.sql 内容的loop 似乎根本没有捕获内容(在第一个示例中)或仅捕获目录中第一个文件的内容(第二个示例)。所以我的问题。有没有办法从SQL Text File (.sql) 中提取内容?这可能会导致.txt/.Rmd 如下:(但不必):

第一个循环的输出:my_sql_statement.sql

第二个循环的输出:Select * From Data

【问题讨论】:

  • 所以您只想从各种文件中获取所有查询并将它们放入一个 .txt 中?
  • 嗨@JakubKania 是的,完全正确。最好是.Rmd,但这只是一个理想
  • 您确定不想改用版本控制系统?
  • 是的,运行上层命令会很棒。不过谢谢你的建议!

标签: r knitr r-markdown


【解决方案1】:

这个 RMD 文件生成一个 markdown/HTML 文档,列出一些元数据和所有指定文件的内容:

---
title: "Collection of SQL files"
author: "SQLCollectR"
date: "`r format(Sys.time(), '%Y-%m-%d')`"
output: 
  html_document: 
    keep_md: yes
---

```{r setup, echo = FALSE}
library(knitr)
path <- "files/"
extension <- "sql"
```

This document contains the code from all files with extension ``r extension`` in ``r paste0(getwd(), "/", path)``.

```{r, results = "asis", echo = FALSE}
fileNames <- list.files(path, pattern = sprintf(".*%s$", extension))
fileInfos <- file.info(paste0(path, fileNames))

for (fileName in fileNames) {
  filePath <- paste0(path, fileName)
  cat(sprintf("## File `%s` \n\n### Meta data \n\n", fileName))
  cat(sprintf(
    "| size (KB) | mode | modified |\n|---|---|---|\n %s | %s | %s\n\n", 
    round(fileInfos[filePath, "size"]/1024, 2), 
    fileInfos[filePath, "mode"],
    fileInfos[filePath, "mtime"]))
  cat(sprintf("### Content\n\n```\n%s\n```\n\n", paste(readLines(filePath), collapse = "\n")))
}

```

所有工作都在for 循环中完成,该循环遍历path 中名称以extension 结尾的所有文件。对于每个文件,都会打印一个带有“元数据”的表格,然后是实际的文件内容。元数据使用file.info 检索,由文件大小、模式和上次修改时间戳组成。

包含 markdown 的 cat(sprintf(... 构造使代码看起来很复杂,但实际上它相当简单。

样本输出

使用来自this answer 的带有 SQL 语句的 SQL 文件,上面的 RMD 文件生成以下输出(使用 HTML 作为输出格式):

【讨论】:

  • 太棒了!非常感谢!
【解决方案2】:

为了从不代表分隔表的文本文件中读取内容,您可能需要使用readLines 而不是read.tableR 的做法是使用 lapply:

files <- list.files(path=path, pattern="*.sql", full.names=T, recursive=FALSE)
out.files <- lapply(files,readLines)

这将为您提供一个包含字符向量的列表(每个元素是文件的一行)。

编辑:

要回答您的其余问题,可以使用 writeLines 将此类数据转换为单个文本文件。

names(out.files)<-files
printer = file("out.sql","w");
lapply(files,function (x) 
{
   writeLines(x,printer);
   writeLines(out.files[[x]],printer);
})
close(printer)

如果您在 R 中进行其他操作,我只会执行所有这些操作,否则有更简单的方法可以将一堆文件附加到一个文件中。

【讨论】:

  • 您好,谢谢。但是有没有办法将文件名本身分离/包含到生成的.txt中。没有它,它只是 .txt 和 .sql 语句
  • 如果名称尚未附加到 out.files,您可以使用 names(out.files)
  • 输出看起来非常非结构化。我正在使用write.list {erer}
  • @HiThere 也许您应该尝试writeLines,而不是write.list {erer}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多