Exportation de R vers Access avec RODBC

R et systèmes d'exploitation, configuration de R, gestion de la mémoire, construction des packages, interfaces entre R et d'autres logiciels, éditeurs pour R

Modérateur : Groupe des modérateurs

Jacques VESLOT
Messages : 13
Enregistré le : 04 Mai 2005, 07:20

Exportation de R vers Access avec RODBC

Messagepar Jacques VESLOT » 16 Mar 2006, 12:47

Bonjour,

J'ai systématiquement ces messages d'erreur en voulant exporter deux dataframes dans Access :

Erreur dans sqlSave(channel = channel, flore, "Florist") :
[RODBC] ERROR: Could not SQLExecDirect
37000 -3553 [Microsoft][Pilote ODBC Microsoft Access] Erreur de syntaxe dans la définition de champ.

S'agissant de l'un d'entre eux, je peux, **après l'avoir sauvegardé au format Excel**, l'importer manuellement dans ma base de données Access. Au format texte, je n'y parviens pas (?).

Pour l'autre, c'est plus difficile, car il fait plus de 120000 lignes.

Je procède comme suit :

Code : Tout sélectionner

library(RODBC)
channel <- odbcConnectAccess("d:/test.mdb")
sqlSave(channel=channel, abond, "Abond", rownames=F)
odbcClose(channel)


A noter que ça marche pour d'autres dataframes.

Les particularités de ceux que je n'arrive pas à exporter sont :
- la présence de dates au format Date (j'ai essayé en les mettant sous forme de chaine de caractères, de facteur, au format POSIX, mais ça ne change rien);
- la présence de NAs et de <NA>s (j'ai essayé de modifier les facteurs comportant les <NA> : d'en faire des chaines de caractères, de mettre un niveau "" à la place des <NA>s, et d'utiliser le paramètre nastring);

Je ne trouve plus rien à essayer. Si vous avez une idée...

Jacques

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 16 Mar 2006, 18:18

Bonjour Jacques,

Ci-dessous un fragment de code écrit il y a qque temps pour exporter des data.frames dans une base Access pré-existante (définie dans l'argument "laser" de la fonction BeefToLaser. Attention, les tables de la base existante sont vidées avant exportation des data.frame (fct sqlClear):

Code : Tout sélectionner

library(RODBC)




BeefToLaser <- function(tab, laser){
  on.exit(odbcCloseAll())
  listobj <- objects(name = 1)
  n <- match(tab, table = listobj)
  if(is.na(n))
    stop("Le tableau ", tab, " n'existe pas dans l'espace de travail courant.\n")
  nam <- listobj[n]
  dat <- get(nam)
  NAM <- ifelse(substring(nam, 3, 7) == "Param", nam, toupper(nam))
  canal <- odbcConnectAccess(laser)
  sqlClear(channel = canal, sqtable = NAM)
  sqlSave(channel = canal, dat = dat, fast = FALSE, safer = FALSE, tablename = NAM, rownames = FALSE, colnames = FALSE)
  cat("La table", NAM, "a été renseignée dans la base", laser, "\n")
  odbcCloseAll()
  invisible(NULL)
  }


Laser <- "C:/Data/Laser/base/Laser.mdb"


Tables <- c("T_Param_Region", "T_Param_Unite", "T_Param_SubUnite", "T_Param_Gene",
            "T_Param_Test_Diag", "T_Param_Type_Prelev",
            "T_lieu", "T_mouvment", "T_concess", "T_boucle", "T_concani", "T_animal", "T_labo")


for(i in seq(length(Tables)))
  BeefToLaser(tab = Tables[i], laser = Laser)


Les différents data.frame contenaient des champs de toute nature (numérique, date, caractère,...). J'ai galéré pour trouver la bonne syntaxe (i.e., ne plantant pas !) avec sqlSave.

J'ai aussi développé du code pour créer des tables ex-nihilo dans une base existante, et Xavier Juanès avait écrit un petit exécutable en Visual Basic pour créer une base Access (à appeler depuis R). Malheureusement, je n'ai jamais eu le temps de tester tout ça et de le carosser pour l'inclure dans le package metomet. Veux-tu que nous y réfléchissions ?

Amicalement,

Renaud

Jacques VESLOT
Messages : 13
Enregistré le : 04 Mai 2005, 07:20

sqlSave

Messagepar Jacques VESLOT » 17 Mar 2006, 12:48

Salut Renaud,

Merci beaucoup pour ton aide.

J'ai essayé de m'inspirer de la fonction BeefToLaser() mais sans succès.

Du coup, j'ai opté pour une autre stratégie, à savoir d'exporter colonne par colonne mon dataframe, soit ainsi :

Code : Tout sélectionner

library(RODBC)
canal <- odbcConnectAccess("d:/test2.mdb")
for (i in names(flor))
   {
   cat(i)
   sqlSave(channel=canal, dat=flor[i])
   }
odbcClose(canal)


Ce qui m'a permis :

1) De détecter un premier problème, à savoir la présence d'apostrophe dans mes chaines de caractère, qui passent dans R mais qui doivent entrer en conflit avec la syntaxe SQL, car une fois éliminées (les apostrophes), toutes les colonnes sont exportées correctement, sauf...

2) sauf ma variable "date"; et là, ça reste insoluble pour moi, car j'ai beau transformer mes dates en POSIX, en Date, et même en chaine de caratères, ma variable "date" reste inexportable; j'ai aussi essayé avec l'argument varTypes, varTypes=c(date="Date") ou varTypes=c(date="Date/Heure"), mais je ne sais pas si j'utilise correctement cet argument car il n'y a pas d'exemple avec varTypes sur la page d'aide.

Voilà...

Amicalement,

jacques

Jacques VESLOT
Messages : 13
Enregistré le : 04 Mai 2005, 07:20

sqlSave

Messagepar Jacques VESLOT » 20 Mar 2006, 11:02

J'ai finalement trouvé ce qui posait problème chez moi.

J'avais appelé une variable "date", ce qui doit - j'imagine ? - créer des conflits avec la fonction date().

En conclusion :
1) Ne pas appeler ses variables "date" - mais plutôt dates par ex.;
2) Conserver les dates au format Date et utiliser ainsi varTypes :
sqlSave(channel=canal, dat=DF, varTypes=c(dates="Date"))

jacques


Retourner vers « Archives : Environnement de R »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité