2015-12-03 4 views
0

Я в общей сложности SQL невежду, поэтому я прошу прощения, если это очень просто ..учета ведущие нули с sqldf

У меня есть данные, которые содержат столбец 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 

Кроме того, я хотел бы добавить, что длина не одинакова для всех этих идентификаторов. Если это возможно, я хотел бы избежать необходимости вручную пэд данные нулями постфактум ..

+0

В ваших * реальных * данных находится столбец ('v1'), хранящийся на диске с ведущими нулями? – nrussell

+0

@ nrussell Да, это так. – panterasBox

+0

Честно говоря, я бы просто прочитал данные в обычном режиме с помощью 'read.table (..., colClasses =" character ")' - или еще лучше, используйте 'data.table :: fread' - и затем обработайте данные соответствующим образом. Вы всегда можете использовать 'sqldf' для управления объектами, которые вы читаете. – nrussell

ответ

2

Используйте 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="|") 
0

Один из способов запуска ведущих нулей - использовать строковые функции SQL. Просто наложите количество нулей выше требуемой длины строки, объединитесь с вашим фактическим полем идентификатора и разделите с самого правого символа указанную длину требуемого столбца. Ниже используется 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)) 
Смежные вопросы