2012-07-22 4 views
0

J'ai recherché haut et bas pour une résolution à cette situation, et testé quelques méthodes différentes, mais je n'ai pas eu de chance jusqu'à présent. Au fond, j'ai un fichier avec les données dans le format suivant que je dois convertir en un fichier CSV:Python - Analyser Conundrum

(previously known as CyberWay Pte Ltd) 
0 2019 
01.com 
0 1975 
1 TRAVEL.COM 
0 228 
1&1 Internet 
97 606 
1&1 Internet AG 
0 1347 
1-800-HOSTING 
0 8 
1Velocity 
0 28 
1st Class Internet Solutions 
0 375 
2iC Systems 
0 192 

J'ai essayé d'utiliser re.sub et de remplacer les espaces entre les numéros sur toutes les autres lignes par une virgule , mais n'ont pas eu de succès jusqu'à présent. J'avoue que normalement j'analyse de CSVs, donc le texte brut a été un peu un défi pour moi. Je devrais maintenir les formats de chaîne qui sont au-dessus de chaque ensemble de nombres respectifs.

Je préfère le CSV à formater en tant que tel:

foo bar 
0,8 
foo bar 
0,9 
foo bar 
0,10 
foo bar 
0,11 

Il y a environ 50 000 entrées, donc la modification manuelle cela prendrait une quantité obscène de temps.

Si quelqu'un a des suggestions, je serais très reconnaissant.

Merci beaucoup.

+0

Alors c'est simplement que vous voulez une virgule au lieu d'un espace entre les deux entrées sur une ligne sur deux? – DSM

+0

Le format de sortie que vous décrivez n'est pas un fichier CSV "réel", car les lignes ont des nombres d'éléments différents. Lire ceci avec un lecteur CSV est susceptible de produire des résultats ou des erreurs étranges. – BrenBarn

Répondre

0

Si j'ai bien compris vos besoins, vous avez besoin d'une bande() sur toutes les lignes et une division basée sur les espaces sur les lignes paires (lignes à partir de 1):

import re 

fp = open("csv.txt", "r") 
while True: 
    line = fp.readline() 
    if '' == line: 
      break 
    line = line.strip() 
    fields = re.split("\s+", fp.readline().strip()) 
    print "\"%s\",%s,%s" % (line, fields[0], fields[1]) 
fp.close() 

La sortie est un fichier CSV (vous pourriez avoir besoin pour échapper à des citations si elles se produisent dans votre entrée):

"Content of odd line",Number1,Number2 

Je ne comprends pas le « foo, bar » vous placez en-tête sur les lignes impaires de votre exemple, bien que.

+0

C'est parfait, merci beaucoup. – Buzztrollington

2

Si vous voulez juste pour remplacer les espaces par des virgules, vous pouvez simplement faire:

line = ','.join(line.split()) 

Vous aurez à faire ce que sur toutes les autres lignes, mais de votre question, il semble que vous déjà compris comment travailler avec toutes les autres lignes.

+0

Deux bonnes réponses sur celui-ci, merci beaucoup à tous. – Buzztrollington