Insérer un séparateur dans un fichier texte - Divers - Programmation
Marsh Posté le 11-07-2014 à 09:57:45
Bon j'ai trouvé une procédure avec Stata, mais j'ai des soucis dans le dictionnaire, il reste des blancs dans le fichier texte qui décalent les colonnes qu'il faut que je supprime ...
Marsh Posté le 11-07-2014 à 11:02:29
Bonjour,
Si tu donnes un exemple de ligne en entrée et de ligne souhaitée en sortie, je t'écris le code Perl correspondant.
A+,
Marsh Posté le 11-07-2014 à 13:00:33
!
Magicpanda a écrit : Bonjour, |
Tu veux dire quoi par "les espaces délimités" ? C'est le format de ton fichier, ou tes valeurs sont séparées par des espaces ?
Si tu le fais en shell, tu peux peut-être utiliser la syntaxe ${string:position:length} pour extraire une partie d'une chaîne de caractères.
Edit : Voici un petit exemple
Code :
|
Marsh Posté le 11-07-2014 à 14:52:07
quand je dis espace délimité, j'ai une suite de chiffres genre
45456465489879871213213548979843415321356
et j'ai un codebook a coté qui me dit
premier variable : 2 premières valeurs
deuxieme : 3 suivants
etc ..
J'ai trouvé une syntaxe d'importation qui fonctionne pour SPSS je pense que c'est bon merci !
j'ai effectivement trouvé des tutos pour le faire en python et en perl, il faudra que je m'y penche, d'habitude je le fais avec R mais là le fichier est trop gros pour être digéré !
Marsh Posté le 11-07-2014 à 15:13:58
ma syntaxe sps
|
Marsh Posté le 11-07-2014 à 18:37:26
Citation : V137 270-271 A2 |
Il y a une erreur a la dernière ligne: ce devrait être V138 272-272 F1.0. non?
A+,
Marsh Posté le 11-07-2014 à 19:40:47
Voici un truc en perl cablé sur ton format (avec un peu d'effort, on pourrait en faire un truc générique).
Code :
|
il reste le cas de ta 5e variable, la seule F a ne pas être en .0
V5 19-32 F14.1
Faut il réintégrer le point décimal? et si oui, F14.1, c'est 1 chiffre avant et 13 après?
Si oui, en remplaçant à la fin
print $outfile join(';', unpack($packformat, $_)), "\n";
par
my $line = join(';', unpack($packformat, $_));
print $outfile substr($line, 0, 24), ".", substr($line, 24), "\n";
ça devrait baigner.
Bon par contre si les F en .0 doivent être écrits avec un 0. ou un . devant, c'est faisable, mais juste un poil plus compliqué (et un peu plus lent aussi, car il faudra faire une boucle sur keys %var pour chaque ligne lue).
A+,
Marsh Posté le 11-07-2014 à 23:28:33
Merci beaucoup Gilou, effectivement il y avait une coquille dans la derniere ligne !
revanche le f14.1 reste, c'est la nomenclature du recensement espagnol ;-)
f14.1 je ne sais pas pourquoi SPSS le code comme ca, mais c'est 3 chiffres, puis une décimale et 11 autres.
les F.0 sont des entiers en fait ;-) mais par défaut j'ai demandé à spss de prendre des flottants pour pas avoir a gérer de cas particuliers
Marsh Posté le 12-07-2014 à 02:43:45
> f14.1 je ne sais pas pourquoi SPSS le code comme ca, mais c'est 3 chiffres, puis une décimale et 11 autres.
Dans ce cas la, c'est
my $line = join(';', unpack($packformat, $_));
print $outfile substr($line, 0, 26), ".", substr($line, 26), "\n";
si tu veux faire apparaitre le point entre les 3 premiers chiffres et les 11 autres.
ou mon code initial
print $outfile join(';', unpack($packformat, $_)), "\n";
si pas de point et juste la suite des 14 chiffres figurant entre les positions 19 et 32
A+,
Marsh Posté le 12-07-2014 à 03:30:49
Magicpanda a écrit : f14.1 je ne sais pas pourquoi SPSS le code comme ca, mais c'est 3 chiffres, puis une décimale et 11 autres. |
Euh non.
J'ai la doc SPSS 12.0 Command Syntax Reference sous les yeux.
Pour du Fixed-Format Data, ce qui est ton cas, il est dit:
Citation : If a value has no coded decimal point but the input format specifies decimal positions, the |
Donc s'il n'y a pas de point dans tes datas mais uniquement des chiffres, f14.1,c'est un champ de 14 chiffres, et ça correspond a 13 chiffres avant la décimale et un après.
C'est d'ailleurs cohérent avec la notation Fn.0 tous les n chiffres sont avant la décimale (car il y en a 0 après), on adonc un entier.
3 chiffres, puis une décimale et 11 autres, c'est F14.11 selon cette doc.
A+,
Marsh Posté le 12-07-2014 à 19:21:28
Effectivement c'est étrange, je vais vérifier dans le fichier de données pour voir le résultat
Marsh Posté le 12-07-2014 à 19:25:30
Assez étrangement, les variables F sont en fait des entiers, sauf la V5
la V5 a bien une décimale, mais c'est 1 avant et 13 après le séprateur. Donc il y a bien un soucis quelque part, il faut que je clean le dico en regardant la doc du fichier
Marsh Posté le 12-07-2014 à 22:37:24
Magicpanda a écrit : Assez étrangement, les variables F sont en fait des entiers, sauf la V5 |
Donc quelqu'un a pensé que ça correspondait à F14.1 alors que cela correspond a F14.13
A+,
Marsh Posté le 11-07-2014 à 07:55:10
Bonjour,
J'ai un fichier texte d'environ 40 millions de lignes pour 1 Go.
Je l'analyse avec R
C'est un fichier qui contient pour chaque ligne une suite de chiffres.
J'ai le codebook qui m'indique les espaces délimités (par exemple les 2 premiers chiffres correspondent à la variable 1, les 3 chiffres suivant à la variable 2)
Pour l'importer et l'utiliser j'ai donc besoin de le convertir en csv ou équivalent.
De ce que j'ai vu, le plus pratique pour ca c'est awk, mais je n'ai pas trouvé de syntaxe pour indiquer nominalement à quel endroit il faut introduire le séparateur dans le fichier ...
Si vous avez une astuce pour ces méthodes je suis preneur
Message édité par Magicpanda le 11-07-2014 à 09:00:09
---------------
" Quel est le but du capital ? Le but du capital c'est produire pour le capital. L'objectif, lui, est illimité. L'objectif du capital c'est produire pour produire." - Deleuze || André Gorz - Vers la société libérée