如何使用 R 提取 SQL-Files 的内容?
How to extract the content of SQL-Files using R?
我的一位同事 folder/directory 满是 sql
陈述。该文件夹也由他每天更新。我想为期货同事记录这些 sql
声明。但是,我正在寻找一种方法来 "automate" 该过程。
我考虑过每周使用一次 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
为了从不代表分隔 table 的文本文件中读取内容,您可能需要使用 readLines
而不是 read.table
。 R
的方法是使用 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 中进行一些其他操作,我只会做所有这些,否则有更简单的方法将一堆文件附加到一个文件中。
此 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
结尾的所有文件。对于每个文件,打印 table 和 "meta data",然后是实际文件内容。元数据使用 file.info
检索,包括文件大小、模式和最后修改的时间戳。
包含 markdown 的 cat(sprintf(...
构造使代码看起来很复杂,但实际上它相当简单。
示例输出
使用 SQL 文件和来自 this answer 的 SQL 语句,上面的 RMD 文件生成以下输出(使用 HTML 作为输出格式):
我的一位同事 folder/directory 满是 sql
陈述。该文件夹也由他每天更新。我想为期货同事记录这些 sql
声明。但是,我正在寻找一种方法来 "automate" 该过程。
我考虑过每周使用一次 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
为了从不代表分隔 table 的文本文件中读取内容,您可能需要使用 readLines
而不是 read.table
。 R
的方法是使用 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 中进行一些其他操作,我只会做所有这些,否则有更简单的方法将一堆文件附加到一个文件中。
此 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
结尾的所有文件。对于每个文件,打印 table 和 "meta data",然后是实际文件内容。元数据使用 file.info
检索,包括文件大小、模式和最后修改的时间戳。
包含 markdown 的 cat(sprintf(...
构造使代码看起来很复杂,但实际上它相当简单。
示例输出
使用 SQL 文件和来自 this answer 的 SQL 语句,上面的 RMD 文件生成以下输出(使用 HTML 作为输出格式):