Comment identifier dynamiquement des délimiteurs inconnus dans un fichier de données?
J'ai trois fichiers d'entrée. Chacun utilise un autre délimiteur pour les données qui y sont contenues. Les données d'un fichier ressemble à ceci:
pommes | bananes | oranges | raisins
fichier de données deux ressemble à ceci:
trimestre, dime, le nickel, le penny
fichier de données trois ressemble à ceci:
cheval, vache, cochon poulet chèvre
(le changement dans le nombre de colonnes est également intentionnelle)
La pensée que j'ai eu était de compter le nombre de caractères alpha, et suppose que le nombre le plus élevé était le caractère de séparation. Toutefois, les fichiers avec les non-espace séparateurs ont également des espaces avant et après les séparateurs, de sorte que les espaces de gagner sur tous les trois fichiers. Voici mon code:
def count_chars(s):
valid_seps=[' ','|',',',';','\t']
cnt = {}
for c in s:
if c in valid_seps: cnt[c] = cnt.get(c,0) + 1
return cnt
infile = 'pipe.txt' #or 'comma.txt' or 'space.txt'
records = open(infile,'r').read()
print count_chars(records)
Il permet d'imprimer un dictionnaire avec les comtes de tous les caractères acceptables. Dans chaque cas, l'espace gagne toujours, donc je ne peux pas compter sur elle pour me dire ce que le séparateur est.
Mais je ne peux pas penser à une meilleure façon de le faire.
Des suggestions?
source d'informationauteur Greg Gauthier
Vous devez vous connecter pour publier un commentaire.
Si vous êtes à l'aide de python, je vous suggère de simplement appeler re.split sur la ligne avec toutes les attendus de séparateurs:
Le seul problème serait le cas si l'un des fichiers à utiliser un séparateur en tant que partie des données.
Si vous devez identifier le séparateur, votre meilleur pari est de compter le tout à l'exclusion des espaces. Si il n'y a presque pas d'occurrences, alors il est probablement de l'espace, sinon, c'est le max de la mappé caractères.
Malheureusement, il n'y a vraiment aucun moyen d'en être sûr. Vous pouvez disposer d'un espace séparé de données remplie par des virgules, ou vous pouvez avoir | de données séparées rempli avec des points-virgules. Il peut ne pas toujours fonctionner.
À faire l'essai Python CSV standard: http://docs.python.org/library/csv.html#csv.Sniffer
J'ai fini par aller avec les regex, en raison de la problème de de places. Voici mon code terminé, au cas où ça intéresse quelqu'un, ou pourriez utiliser tout autre chose. Sur un tangentielle remarque, il serait bien de trouver un moyen dynamique d'identifier l'ordre des colonnes, mais je me rends compte que c'est un peu plus délicat. En attendant, je suis en train de tomber en arrière sur le vieux trucs à régler ça.