0
votes

Énorme fichier texte avec une colonne (texte en colonnes en python)

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 à:

 entrez la description de l'image ici

Ce que j'aimerais avoir:

 entrez la description de l'image ici


15 commentaires

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 que df = 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.


3 Réponses :


0
votes

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.

 entrez la description de l'image ici


1 commentaires

Oui, dans Excel, c'est assez simple. Mais cette fois, j'ai des millions d'enregistrements donc Python est mon ami :)



0
votes

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


0 commentaires

0
votes

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 >


0 commentaires