Import avec séparateur au choix

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Montana ROQUILLET
Messages : 43
Enregistré le : 24 Juil 2017, 06:39

Import avec séparateur au choix

Messagepar Montana ROQUILLET » 09 Jan 2020, 13:57

Bonjour à tous,

J'essaie d'importer un fichier volumineux (impossible à ouvrir dans son intégralité sous Excel) avec un séparateur de champ : |@=
J'ai essayé avec toutes les fonctions d'import connues : read. csv, read.csv2, read.table, read.delim, read.delim2, mais il semblerait qu'un séparateur contenant plus d'un caractère ne passe pas...

Comment procéder ?

Merci,

Montana ROQUILLET

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Import avec séparateur au choix

Messagepar François Bonnot » 09 Jan 2020, 15:21

Bonjour,
Le plus simple est de remplacer le séparateur "|@=" par un caractère unique au moyen d'un édiiteur de texte capable de charger le fichier volumineux. Attention cependant à ne pas choisir un caractère déjà présent dans le texte.
Si ce n'est pas possible, il faut écrire une petite fonction de lecture en utilisant par exemple les fonctions R readline() et strsplit().
François

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Import avec séparateur au choix

Messagepar Gabriel Terraz » 09 Jan 2020, 19:09

Bonjour,

Une possibilité est de lire le fichier par ligne, puis de découper avec le séparateur de m****.

Par exemple :

Code : Tout sélectionner

rl <- readLines(myfile)
rl_split <- strsplit(rl, "|@=", fixed = T)
mm <- do.call(rbind, rl_split)
as.data.frame(mm)

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Import avec séparateur au choix

Messagepar Logez Maxime » 12 Jan 2020, 20:03

Bonjour,

une alternative à la solution de Gabriel :

Code : Tout sélectionner

rl <- readLines(myfile)
rl_s <-gsub("\\|@=", ";", rl)
mm <- read.table(textConnection(rl_s), sep = ";", h= T)
Cordialement,
Maxime

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Import avec séparateur au choix

Messagepar Mickael Canouil » 13 Jan 2020, 08:38

Bonjour,

il n'est pas usuel d'avoir plusieurs caractères en tant que séparateur de colonnes (je n'ai pas connaissance de tel type de fichier).

Même, s'il est possible de trouver une solution comme celles proposées, peut-être faudrait-il revenir au type de fichier que vous utilisez.
Je m'explique, si vraiment le format du fichier que vous lisez a besoin d'un tel séparateur, c'est qu'il y a des choses particulières dans les colonnes et que les formats classiques ne convenaient pas, or ici en dehors du séparateur, le fichier sera lu de façon complétement traditionnelle pouvant de ce fait aboutir à une importation erronée des données.

Dans le cas de fichier dans un format spécial, il vaut mieux utiliser la fonction qui va bien (probablement déjà développé sur le CRAN, bioconductor, Github/gitlab, etc.).

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Montana ROQUILLET
Messages : 43
Enregistré le : 24 Juil 2017, 06:39

Re: Import avec séparateur au choix

Messagepar Montana ROQUILLET » 13 Jan 2020, 13:56

Bonjour,

Merci pour vos retours.
Malheureusement, le fichier est trop volumineux pour que je puisse changer le séparateur dans un éditeur type Notepad ++, il ne répond plus et finit par planter...
J'ai essayé vos différentes solutions, mais je bloque à l'import :

Data <- readLines(my file)

J'ai le message d'erreur suivant:

" In readLines(myfile) : line 992390 appears to contain an embedded nul
In readLines(myfile) : incomplete final line found on 'myfile'"

Je comprends ici que la dernière ligne de mon fichier n'aurait pas le même nombre de colonnes que les autres ? Que signifie la première erreur ?

Je suis également étonnée du séparateur, d'autant plus qu'au vu de l'aperçu des données, il s'agit du même type de données que je manipule habituellement et il n'y a nullement besoin d'un séparateur particulier, a priori l'import des données n'aboutira donc pas à une erreur.
Malheureusement je ne choisis pas les formats des fichiers que je manipule, ils proviennent de différentes sources et je dois les traiter pour les mettre au format attendu.

Merci à tous,

Montana ROQUILLET

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Import avec séparateur au choix

Messagepar François Bonnot » 14 Jan 2020, 07:10

Bonjour,
L'argument skipNul = TRUE pourrait peut-être résoudre le problème.
François

Montana ROQUILLET
Messages : 43
Enregistré le : 24 Juil 2017, 06:39

Re: Import avec séparateur au choix

Messagepar Montana ROQUILLET » 14 Jan 2020, 13:10

Bonjour,

L'option skipNul semble fonctionner !
Par contre j'ai encore un warning par la suite...

myfile_split <- strsplit(myfile, "|@=", fixed = TRUE )
test <- do.call(rbind, myfile_split)

J'ai le message d'erreur suivant à la dernière ligne :
" in (function(..., deparse.level = 1) :
number of columns of result is not a multiple of vector length (arg 1)"

J'ai tenté l'autre manière :

myfile_split <- gsub("\\|@=", ";", myfile)
test <- read.table(textConnection (myfile_split), sep=";", h=T)

J'ai le message d'erreur suivant à la dernière ligne :
" error in scan (file = file, what = what, sep=sep, quotd=quote, dec=dec, : line 196 did not have 57 elements"


Que signifient ces erreurs ?

Merci,

Montana ROQUILLET

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Import avec séparateur au choix

Messagepar Logez Maxime » 14 Jan 2020, 13:52

Bonjour,

probablement que dans le corps de ton texte il existe des ";" et que quand tu remplaces ton séparateur à 3 caractères par le point virgule alors il va y avoir une cohfusion entre les points virgules des données et ceux qui servent de séparateur. Ca va faire que pour certaines lignes tu auras plus d'éléments qu'il n'y a de colonne, par que le ";" va séparer aussi des valeurs.
Il te faut remplacer le ";" par un caractère qui n'est pas dans tes données pour éviter de scinder des valeurs (£ ou § ou je ne sais quoi).

Cordialement,
Maxime

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Import avec séparateur au choix

Messagepar François Bonnot » 14 Jan 2020, 14:23

Il te faut remplacer le ";" par un caractère qui n'est pas dans tes données pour éviter de scinder des valeurs (£ ou § ou je ne sais quoi).

Le caractère de tabulation '\t' est un bon séparateur car rarement présent dans des données.
François

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Import avec séparateur au choix

Messagepar Mickael Canouil » 14 Jan 2020, 16:11

Petite suggestion, si votre fichier est vraiment aussi volumineux, je vous recommande vroom (https://cran.r-project.org/web/packages ... index.html).
Mickaël
mickael.canouil.fr | rlille.fr

Montana ROQUILLET
Messages : 43
Enregistré le : 24 Juil 2017, 06:39

Re: Import avec séparateur au choix

Messagepar Montana ROQUILLET » 21 Jan 2020, 10:21

Bonjour,

J'ai finalement réussi à importer le fichier et à le lire correctement !
Malgré le warning suite au code suivant :

myfile_split <- strsplit(myfile, "|@=", fixed = TRUE )
test <- do.call(rbind, myfile_split)

J'ai quand même tenté de créer ma table:

data <-as.data.frame(test)

Et ça fonctionne ! Il semble que les données aient été lues correctement.

Merci à tous pour votre aide,

Montana ROQUILLET

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Import avec séparateur au choix

Messagepar Mickael Canouil » 21 Jan 2020, 12:36

Petite suggestion:

Code : Tout sélectionner

test <- do.call(rbind.data.frame, myfile_split)


Cela évitera les conversions étrange si les éléments de la liste "myfile_split" sont des matrices de différents types (ou avec des colonnes de différents types) et "test" sera un "data.frame".
Dans votre cas, normalement, il ne s'agit que de matrices de type caractère.

Pour faire de la conversion de type automatique (comme lors de l'utilisation des read.*()):

Code : Tout sélectionner

test[] <- lapply(test, type.convert)


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

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