2009-05-26 8 views
2

J'ai un fichier CSV avec plusieurs entrées, et chaque entrée a 2 dates formatées Unix timestamp. J'ai une méthode appelée convert(), qui prend l'horodatage et le convertit en YYYYMMDD.Subtitution Regex en Python

Maintenant, puisque j'ai 2 timestamps dans chaque ligne, comment pourrais-je remplacer chacun d'eux par la nouvelle valeur?

EDIT: Juste pour clarifier, je voudrais convertir chaque occurrence de l'horodatage dans le format YYYYMMDD. C'est ce qui m'embête, car re.findall() retourne une liste.

Répondre

1

Je suppose que par "date formatée d'horodatage unix" vous voulez dire un nombre de secondes depuis l'époque. Cela suppose que chaque nombre dans le fichier est un horodatage UNIX. Si ce n'est pas le cas, vous devrez régler la regex:

import re, sys 

# your convert function goes here 

regex = re.compile(r'(\d+)') 
for line in sys.stdin: 
    sys.stdout.write(regex.sub(lambda m: 
    convert(int(m.group(1))), line)) 

Ce STDIN et appels convertir chaque numéro trouvé.

Le "truc" ici est que re.sub peut prendre une fonction qui transforme d'un objet de correspondance en une chaîne. Je suppose que votre fonction de conversion attend un int et renvoie une chaîne, donc j'ai utilisé un lambda comme une fonction d'adaptateur pour attraper le premier groupe de la correspondance, le convertir en un int, puis passer ce int résultant à convertir.

+0

merci! Je commence encore Python, et cela aide beaucoup. – aaront

+0

Je reçois une erreur "no such group". – aaront

+0

Hmmm ... À quoi ressemble la ligne d'entrée sur laquelle vous tapez cette erreur? (Vous pouvez ajouter un appel 'sys.stdout.flush()' juste après la ligne 'sys.stdout.write' pendant le débogage.) –

3

Si vous connaissez le remplacement:

p = re.compile(r',\d{8},') 
p.sub(','+someval+',', csvstring) 

si c'est un changement de format:

p = re.compile(r',(\d{4})(\d\d)(\d\d),') 
p.sub(r',\3-\2-\1,', csvstring) 

EDIT: désolé, vient de réaliser vous avez dit python, modifié ci-dessus

+0

mon python est un peu sommaire, j'espère que j'ai bien compris. –

+1

Il a dit un horodatage Unix, qui devrait être quelque chose comme 1243326265 (heure actuelle). Il veut le format YYYYMMDD en sortie. – tzot

0

J'utiliserais quelque chose dans ce sens. Un peu comme la réponse de Laurence mais avec la conversion d'horodatage que vous avez demandée et prend le nom de fichier comme param. Ce code suppose que vous travaillez avec des dates récentes (après le 09/09/2001). Si vous avez besoin de dates antérieures, diminuez de 10 à 9 ou moins.

import re, sys, time 

regex = re.compile(r'(\d{10,})') 

def convert(unixtime): 
    return time.strftime("%Y%m%d", time.gmtime(unixtime)) 

for line in open(sys.argv[1]): 
    sys.stdout.write(regex.sub(lambda m: convert(int(m.group(0))), line)) 

EDIT: nettoyage du code.

Exemple d'entrée

foo,1234567890,bar,1243310263 
cat,1243310263,pants,1234567890 
baz,987654321,raz,1 

Sortie

foo,20090213,bar,20090526 
cat,20090526,pants,20090213 
baz,987654321,raz,1 # not converted (too short to be a recent)