繁体   English   中英

使用sqldf保持前导零

[英]keeping leading zeros with sqldf

我对SQL完全无知,所以对这很简单表示歉意。

我的数据包含一个由数字组成的ID列,并且在许多情况下包含前导零。 我想使用sqldf导入数据,但是这样做会丢失这些字符的前导零。 有没有办法保持前导零? 也许通过某种方式指定所有列都是字符类,就像R的read.table中一样?

由于工作性质,我无法共享数据,但是我正在执行以下操作:

a <- formatC(sample(1:99, 10), width = 8, format = "d", flag = "0")
fakeDF <- data.frame(v1=a, v2=rnorm(10, 0, 1))
f1 <- tempfile()
write.table(fakeDF, file=f1, quote=FALSE, row.names=FALSE, col.names=FALSE, sep="|")

f2 <- file(f1)
mydat <- sqldf::sqldf("SELECT * FROM f2", dbname=tempfile(), 
                      file.format=list(header=FALSE, sep="|", eol="\n", skip=1))
mydat

另外,我想补充一下,所有这些ID的长度都不相同。 如果可能的话,我想避免在事实结束后必须手动将数据填充为零。

使用colClasses

library(sqldf)

read.csv.sql(f1, header = FALSE, sep = "|", colClasses = c("character", "numeric"))

给予:

        V1         V2
1  00000029  1.7150650
2  00000078  0.4609162
3  00000040 -1.2650612
4  00000085 -0.6868529
5  00000090 -0.4456620
6  00000005  1.2240818
7  00000050  0.3598138
8  00000083  0.4007715
9  00000051  0.1106827
10 00000042 -0.5558411

注意:我们使用了使用此随机种子生成的输入文件:

set.seed(123)

a <- formatC(sample(1:99, 10), width = 8, format = "d", flag = "0")
fakeDF <- data.frame(v1=a, v2=rnorm(10, 0, 1))
f1 <- tempfile()
write.table(fakeDF, file=f1, quote=FALSE, row.names=FALSE, col.names=FALSE, sep="|")

运行前导零的一种方法是使用SQL字符串函数。 只需施加比所需的字符串长度高的零,并与您的实际ID字段连接,然后从最右边的字符中删除所需的指定列长度即可。 下面使用8个字符作为字符串长度:

mydat <- sqldf::sqldf("select rightstr('0000000000000' || ID, 8) As LeadZeroID, 
                              * from f2;", 
                       dbname=tempfile(), 
                       file.format=list(header=FALSE, sep="|", eol="\n", skip=1))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM