Je suis aux prises avec une tâche qui peut gagner beaucoup de temps. Je suis nouveau sur Python, alors ne me tuez pas :)
J'ai un énorme fichier txt avec des millions d'enregistrements. J'avais l'habitude de les diviser dans MS Access, délimiteur "|", filtrer les données afin que je puisse avoir environ 400K enregistrements, puis copié dans Excel.
En gros, le fichier ressemble à:
Ce que j'aimerais avoir:
3 Réponses :
J'utilise LibreOffice donc je ne suis pas sûr à 100% d'Excel mais si vous changez le .txt en .csv et essayez d'ouvrir le fichier avec Excel, cela devrait permettre de changer le délimiteur d'une virgule à '|' puis importez-le directement. Cela fonctionne de toute façon avec LibreOffice Calc.
Oui, dans Excel, c'est assez simple. Mais cette fois, j'ai des millions d'enregistrements donc Python est mon ami :)
vous devez diviser le fichier en lignes, puis diviser les lignes par le caractère l et mapper les données à une liste d'o dicts.
with open ('filename') as file:
data = [{'id': line[0], 'fname':line[1]} for line in f.readlines()]
vous devez remplir les trois autres champs
Faire cela avec pandas sera beaucoup plus facile
Remarque: je suppose que chaque entrée est sur une nouvelle ligne.
import pandas as pd
data = pd.read_csv("data.txt", delimiter='|')
# Do something here or let it be if you want to just convert text file to excel file
data.to_excel("data.xlsx")
p >
Est-ce que "stocker les données dans une base de données SQL" serait une option pour votre cas d'utilisation?
Il est stocké dans la base de données SQL. Malheureusement, il est difficile d'améliorer la requête SQL afin que je puisse recevoir beaucoup moins d'enregistrements.
"Malheureusement, il est difficile d'améliorer la requête SQL" - Comment cela?
Les formules spécifiques doivent être analysées séparément. Je veux dire probablement que c'est améliorable, mais pour moi, la solution Python semble plus simple. Il suffit de savoir comment corriger le texte des colonnes et les autres filtres doivent être simples comme je les ai utilisés auparavant.
S'il est simple de les filtrer à partir de votre fichier CSV, il est simple de les filtrer avec SQL.
Désolé, je ne comprends pas la différence entre le fichier et votre sortie. Pouvez-vous l'expliquer?
Comme je n'ai pas d'accès direct à la base de données sql (+ connaissances SQL débutantes), je resterais avec la solution Python pour le moment. Pourriez-vous s'il vous plaît me conseiller comment résoudre mon problème?
L'entrée est dans 1 colonne. La sortie est la première ligne divisée par "|" en 5 colonnes. Tout comme le texte aux colonnes d'Excel.
Avez-vous essayé d'utiliser des
pandas? La lecture de votre csv serait aussi simple quedf = pd.read_csv ('my_csv.csv', sep = '|')Oh mon Dieu. Ça marche. Je connais le panda, je ne savais tout simplement pas que je pouvais utiliser «sep». Merci beaucoup!
S'il est déjà stocké dans une base de données SQL, vous n'avez probablement pas besoin de le transformer en texte, puis de l'analyser à nouveau avec des pandas du tout . Je ne vois toujours pas pourquoi vous n'utilisez pas la base de données SQL telle quelle.
J'aurais besoin de penser à mettre à jour mes requêtes SQL alors. Pour le moment, j'ai besoin de stocker des données brutes, donc je demande des fichiers txt, qui sont assez légers par rapport à xlsb.
Je suis cependant d'accord avec @Tomalak. Si vous exécutez une requête pour l'obtenir sous forme de texte, vous pouvez tout aussi facilement l'interroger avec python. Je viens de suggérer des pandas parce que c'est la question que vous avez posée.
Je dirais que réfléchir à la mise à jour de vos requêtes SQL est une entreprise plus fructueuse que de concevoir toutes sortes de moyens pliés en arrière pour éviter de penser à mettre à jour ces requêtes SQL. :)
Ok, je vais certainement y réfléchir alors. Merci pour votre aide les gars.