我正在从数据库(test1)中读取一个大数据文件。数百万行我无法在R中直接阅读和处理。
我想基于“horodatage”列从这个大文件创建子文件。我在下面给出了一个示例,从大文件中提取一个文件,但现在我想在这两个日期之间为所有文件执行此操作。
拆分必须从此日期“23/03/2005 11:00”开始,一直到大文件的末尾(大约在“2005年12月31日23:59”左右(来自数据库的test1)和一个子文件的持续时间必须是30分钟(换句话说:每个子文件正好36000行)。
然后必须保存每个子文件,名称如(A200503231100.dat,A200503231130.dat,A200503231200.dat,A200503231230.dat等...)
列horodatage的格式已经
> class(montableau$horodatage)
[1] "POSIXct" "POSIXt"
我开始使用的代码是:
heuredebut = "23/03/2005 11:00"
heurefin = "23/03/2005 11:30"
query = paste("select * from test1 where horodatage >= ",heuredebut," and horodatage < ",heurefin," order by horodatage;",sep="'")
montableau <- dbGetQuery (connection_db,query)
如果您对此大文件的循环有任何见解,那将非常有用。
答案 0 :(得分:1)
R中的日期有点令人讨厌。
这里的关键技巧是使用strptime函数以您需要的方式格式化日期。
# Quick function to go from string to time
cleanDate <- function(x){
as.POSIXct(strptime(x, '%d/%m/%Y %H:%M'))
}
# Function to print time in format of SQL database
printDate <- function(x){
as.character(x, '%d/%m/%Y %H:%M')
}
# Create sequence of times
times <- seq(
cleanDate('23/03/2005 11:00'),
cleanDate('01/01/2006 00:00'),
by = 60 * 30) # adding 30 minutes
for( i in 1:(length(times) - 1) ){
# Generate SQL
sql <- paste("select * from test1 where horodatage >= ",
printDate(times[i]),
" and horodatage < ",
printDate(times[i+1]),
" order by horodatage;",sep="'")
# Query
montableau <- dbGetQuery (connection_db, sql)
# Write table
write.table(montableau,
file= as.character(times[i], 'A%Y%m%d%H%M.dat'),
row.names=FALSE, sep="\t", quote=FALSE)
}