2016-12-01 5 views
0

ExempleComment capturer un élément dans des colonnes avec des espaces autour?

300  january  10  20  
    300  februari 120,30 10  
    300  march  20,30  10  
    300,10  april  20,30 10  
    300  may   420,10 10,46 

Je veux réorganiser les colonnes.
La première chose que je fais est de séparer les colonnes entre le texte en utilisant un séparateur. p.e.
(?<=\S)(\s{2,})(?=\S) ou
(?<=\S)(\s{1,})(?=\S)

Ensuite, je veux mettre les colonnes dans une liste comme ceci:

|300 | |january | | 10 | |20 | 
    |300 | |februari| |120,30| |10 | 
    |300 | |march | |20,30 | |10 | 
    |300,10| | april | | 20,30| |10 | 
    |300 | |may  | |420,10| |10,46| 

résultat attendu:

mylist = [['300 ','january ',' 10 ','20 '] 
      ['300 ','februari','120,30','10 '], 
      ['300 ','march ','20,30 ','10 '], 
      ['300,10',' april ',' 20,30','10 '], 
      ['300 ','may  ','420,10','10,46']] 

Je ne sais pas comment capturer la les espaces.

J'ai essayé de capturer les espaces après utilisation du séparateur:

#find the max length of an element in a column 
lengte_temp = [[len(x) for x in row] for row in mylist] 
maxlengthcolumn = max(l[len(mylist[0])-1] for l in length_temp) 

#add spaces to elements 
for b in range(0,len(mylist)): 
    if length_temp[b][len(mylist[-1])-1] < maxlengthcolumn: 
    mylist[b][len(mylist[-1])-1] = mylist[b][len(mylist[-1])-1] + ' '*(maxlengthcolumn-length_temp[b][len(mylist[-1])-1]) 

mais cela supprime les espaces avant que les éléments d'une colonne.

Comment puis-je capturer les éléments d'une liste comme dans mon exemple ci-dessus?

+0

Le module 'csv'? –

+0

@Chris_Rands, Il me semble que le module csv ne respecte pas les espaces comme dans mon exemple. (Il supprime les espaces et joint la chaîne après avoir mis un nombre d'espace fixe entre les éléments) – Reman

+0

Vous ne pouvez pas utiliser la méthode str.split()? Si je ne me trompe pas, cela préserve les espaces. – Zafi

Répondre

1

En supposant que vous travaillez avec des chaînes, vous pouvez utiliser `ord 'pour obtenir les valeurs ASCII, et diviser votre chaîne où les alphas et les chiffres commencent et se terminent.

Pour le briser: (ce que je l'ai lu ressemble à votre texte original pourrait être un txt)

  1. Prise chaque ligne dans le texte un au moment d'importer votre fichier peut utiliser i/o méthodes (plus à ce sujet here et here)
  2. passe chaque ligne comme une chaîne et convertir en valeurs ascii utilisant ord(), stocker ces valeurs dans une variable
  3. séparée logique Mettre en place pour voir où les mots/numéros commencent (vous devrait chercher un modèle d'alpha, ou numérique, suivi de 0 ou plus alpha/numérique (s) suivi par des espaces, et après ces séries d'espaces, vous devriez trouver une autre alpha ou numérique. Stockez les emplacements de chaque début (début défini comme le premier de la chaîne, ou le premier alphanumérique à suivre après une série d'espaces)
  4. Indexez la ligne de texte avec laquelle vous travaillez actuellement et sortez les chaînes souhaitées.

Cela pourrait être peu clair, donc voir le code ci-dessous psuedo:

strings_start = [5, 12, 22] # this would be where the words/numbers begin in the string that holds a line of your text 
# we'll assume you have some variable, line, which holds the current line of the text you're parsing in a loop 
for i in range(len(strings_start)): 
    if i < len(strings_start) - 1 # subtract 1 because indexes start at 0 
     string_list[i] = line[i: i + 1] 
    else: 
     string_list[i] = line[i:]