0

データベース (test1) からビッグ データ ファイルを読み込んでいます。Rで直接読み取ったり処理したりできない何百万もの行。

この大きなファイルから、列「ホロダゲ」をもとにサブファイルを作成したいと考えています。大きなファイルから 1 つのファイルを抽出する例を以下に示しましたが、これら 2 つの日付の間だけでなく、すべてのファイルに対して実行したいと考えています。

分割は、この日付 "23/03/2005 11:00" から始まり、大きなファイルの終わり (およそ "31/12/2005 23:59" (データベースからの test1) 前後) まで続く必要があります。 1 つのサブファイルは 30 分である必要があります (つまり、サブファイルあたり正確に 36000 行)。

各サブファイルは、(A200503231100.dat、A200503231130.dat、A200503231200.dat、A200503231230.dat など...) のような名前で保存する必要があります。

コラムホロダゲのフォーマットはすでに

> 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)

この大きなファイルに対して実行するループについての洞察があれば、非常に役に立ちます。

4

1 に答える 1

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)

}
于 2016-02-18T12:13:40.477 に答える