【问题标题】:Split a big file from a database by date按日期从数据库中拆分一个大文件
【发布时间】:2016-02-18 11:43:35
【问题描述】:

我正在从数据库 (test1) 中读取一个大数据文件。我无法在 R 中直接读取和处理的数百万行。

我想根据“horodatage”列从这个大文件创建子文件。我在下面给出了一个示例,从大文件中提取一个文件,但现在我想对所有文件执行此操作,而不仅仅是在这两个日期之间。

拆分必须从“23/03/2005 11:00”这个日期开始,一直持续到大文件的末尾(大约在“31/12/2005 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)

如果您对这个大文件的循环有任何见解,那将非常有帮助。

【问题讨论】:

    标签: r date split rpostgresql


    【解决方案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)
    
    }
    

    【讨论】:

    • 非常感谢 user2133017。这真的很有趣。事实是 i, i+1, i+2...的提取给出了相同的输出文件。名字很好(A200503231100.dat, A200503231130.dat, A200503231200.dat....)但是内容是一样的(第一个文件的数据实际上在 11h 到 11h30 之间)。我不确定为什么它没有正确通过数据库,而代码对我来说似乎很好......有什么想法吗?
    • 知道了!!实际上,我忘记在 dbGetQuery 命令中将“查询”更改为“粘贴命令:sql”的新名称!现在工作得很好!非常感谢您提供如此有用的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2016-08-06
    • 1970-01-01
    相关资源
    最近更新 更多