2017-10-11 1 views
1

Voici le code qui récupère des données de la recherche élastique et exporte ces données dans un fichier csv appelé 'mycsvfile'.Comment puis-je imprimer les noms de colonnes dans mon fichier CVS exporté à partir de la recherche élastique?

Je veux changer les noms de colonne afin qu'il soit lisible par un humain.

Voici le code:

from elasticsearch import Elasticsearch 
import csv 

es = Elasticsearch(["9200"]) 

# Replace the following Query with your own Elastic Search Query 
res = es.search(index="search", body= 
       { 
        "_source": ["DTDT", "TRDT", "SPLE", "RPLE"], 
        "query": { 
         "bool": { 
          "should": [ 
           {"wildcard": {"CN": "TEST1"}} 

          ] 
         } 
        } 
}, size=10) 



with open('mycsvfile.csv', 'w') as f: # Just use 'w' mode in 3.x 
    header_present = False 
    for doc in res['hits']['hits']: 
     my_dict = doc['_source'] 
     if not header_present: 
      w = csv.DictWriter(f, my_dict.keys()) 
      w.writeheader() 
      header_present = True 


     w.writerow(my_dict) 

quand je lance la requête au-dessus des données du fichier CSV ressemblent ci-dessous:

DTDT TRDT SPLE SACL RPLE 

20170512 12/05/2017 15:39 1001 0 0 

20170512 12/05/2017 15:39 1001 0 0 

20170908 08/09/2017 02:42 1001 0 0 

20170908 08/09/2017 06:30 1001 0 0 

Comme vous pouvez voir les noms de colonnes sont les mêmes que dans le requête et je veux leur donner des noms lisibles lorsque le fichier est en cours de génération.

Est-ce que quelqu'un pourrait montrer et réparer mon code pour que je puisse entrer les noms de colonnes dans le fichier CSV?

Nous vous remercions à l'avance

+0

Votre question est difficile à comprendre. Vous voulez dire que vous n'êtes pas satisfait de "DTDT" et que vous voulez donner un nom différent à cette colonne, par ex. "rendez-vous amoureux"? – Wli

+0

correct, je veux nommer les colonnes comme la date, etc etc désolé pour la confusion, pourriez-vous modifier mon code et me montrer comment faire cela? – Rich

+0

J'ai modifié votre question pour plus de clarté et y avez répondu. – Wli

Répondre

-2

Vous pouvez essayer d'utiliser pandas géants si vous ne me dérange pas ou sont prêts. Si vous avez utilisé Pandas votre solution serait:

import pandas as pd 

df = pd.DataFrame.read_csv('mycsvfile.csv') 

print(df.columns) 

aussi je voulais juste ajouter que si votre situation d'en-tête est différent ou votre colonne d'index non là, vous devrez peut-être faire quelques ajustements à la déclaration de création de df. Voici les documents link:

+0

Salut Kevin, j'ai essayé de le faire tout à l'heure et je n'ai pas travaillé. pourriez-vous me montrer dans mon code et mis à jour votre réponse? – Rich

+0

Ceci ne répond pas à la question. – Wli

+0

Désolé c'est mon mauvais. Je n'ai pas bien lu la question. considérons d'abord [this] (https: // pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html) c'est la fonction intégrée pour renommer les colonnes de données de pandas. En fonction de ce que j'ai ci-dessus, essayez: 'df.rename (index = str, colonnes = {'DTDT': 'datestamp', 'RPLE': 'code'})' après vous faites les changements que vous voulez, vous pouvez faire un: 'pd.DataFrame.to_csv ('newcsv')' pour obtenir un nouveau csv après vos modifications. –

0

Ce que vous voulez, c'est pour renommer les clés du dictionnaire. To do that, you can for example pop it to a new column name. Exemple de modification DTDT à date.

my_dict['date'] = my_dict.pop('DTDT') 

Je pense que vous pouvez trouver comment renommer vos autres colonnes. Après cela, vous pouvez appeler w.writerow dans votre boucle for.

+0

merci d'avoir jeté un coup d'oeil et je n'ai pas compris cela, j'ai utilisé des exemples en ligne c'est pourquoi je me bats pour faire ce renommer le nom de la colonne, je l'ai si vous pouviez me montrer comment cela se fait dans mon code Exemple? – Rich

+0

C'est l'une des choses les plus triviales à faire pour copier et coller une ligne et changer les chaînes. Si je le fais pour vous, vous n'apprendrez jamais. – Wli

+0

je comprends et je suis entièrement d'accord, mais c'est tout nouveau pour moi c'est pourquoi je suis allé pour le copier-coller et le changement de lignes etc et je suis coincé sur cela depuis des jours et c'est vraiment arriver à un point où je sens comme abandonner parce que ce codage n'est pas mon point le plus fort. J'espère que vous pouvez comprendre – Rich

0

Que diriez-vous de cela? Définissez une dict avec des traductions en haut, par ex. juste après l'initialisation de votre es client, sur la ligne 4 ou 5 ou si:

readableColumnNames = {"DTDT" : "Date", "BLI" : "Blub"} 

puis remplacez cette ligne de code:

w = csv.DictWriter(f, [readableColumnNames[colName] for colName in my_dict.keys()]) 

n'a pas testé ce, pour être honnête, mais il devrait faire le travail, et c'est simple et transparent. Vous voulez probablement vous assurer que les traductions de tous les noms de champs sont réellement fournies. Ou alors, qu'en est-il des noms de champs sensibles dans Elasticsearch :-)?

+0

Salut, où devrais-je mettre le readableColumnNames = {"DTDT": "Date", [...]} ?. Êtes-vous capable de mettre à jour mon code et me montrer. Je pense que je peux le placer au mauvais endroit. merci ces champs drôles sont de la base de données que je n'ai pas créée. – Rich

+0

J'ai clarifié ma réponse à cette fin. Quelle est l'erreur que vous obtenez? J'ai aussi changé un peu la première ligne. Le [...] bit était une ellipse que je voulais que vous remplaciez par quelque chose de significatif. Maintenant, l'exemple fonctionne tel quel, mais vous devez fournir des traductions pour tous les noms de champs, sinon vous obtiendrez une KeyError. –

+0

je fatigué ce que vous avez suggéré, je mets readableColumnNames = {"DTDT": "Date", "BLI": "Blub"} juste après la ligne es, puis j'ai remplacé ma ligne qui est - w.writerow (my_dict) avec votre line - w = csv.DictWriter (f, [readableColumnNames [nomCol]] pour colName dans my_dict.keys()]). Cependant, cela ne fonctionne pas. l'erreur que j'obtiens est - Fichier "C: /Users/.PyCharmCE2017.2/config/scratches/test1.py", ligne 30, dans w = csv.DictWriter (f, [readableColumnNames [colName] pour colName dans my_dict.keys()]) w = csv.DictWriter (f, [readableColumnNames [colName] pour colName dans my_dict.keys()]) KeyError: 'DF' – Rich