web-dev-qa-db-fra.com

Comment puis-je analyser des fichiers extrêmement volumineux (70+ gb) .txt?

J'ai plusieurs .txt Fichiers avec> 30 millions de lignes chacun, et n'importe où de 20 à 40 "colonnes" (certaines cumules de virgule, certains espaces séparés, tous ASCII avec des lignes séparées par une nouvelle ligne) . Je n'ai pas besoin de tous (ni même de la plupart) des colonnes, et certains d'entre eux ont des espaces nuls remplis de NULL.

Mes objectifs sont à:

  1. Supprimer les colonnes que je n'ai pas besoin
  2. Réharegistrez les colonnes comme je vois en forme (pour la lisibilité)
  3. Sortie de tuyau dans un autre fichier .txt, avec des colonnes délimitées par des points

Je viens de le faire avec un grand fichier texte en le divisant ~ 40 .txt Fichiers avec 1 000 000 lignes chacun, les important un par un dans Excel et l'utilisation de concaténate, mais cette approche n'a donné aucun fruit avec ma prochaine cible. Le fichier est séparé par des virgules, mais doit encore être converti de .txt dans .csv et Excel étouffent-il lors du processus d'importation; Même si je l'ai eu dans Excel, le fichier principal tombe dans 200 fichiers plus petits pour se conformer à la limite supérieure de l'Excel et que la même chose plus de 200 fois n'est pas efficace.

Je travaille sur un MacBook Pro final-2020 et je n'ai pas assez de versé dans des langues de codage pour même savoir où commencer, mais je suis script semi-confortable dans Shell et toujours en bas pour apprendre de nouvelles astuces, je ne sais tout simplement pas où commencer.

32
hadrian4909

Choisissez vos outils

Il semble que Excel n'est pas un outil approprié pour ce que vous voulez faire.

Une approche serait d'utiliser un outil différent pour consolider ou résumer les données. awk, sed, grep ou Perl peut être mieux adapté à ce traitement initial et créer un fichier CSV plus petit qui peut ensuite être traité dans Excel ou autre outils.

Il existe d'autres outils qui peuvent être mieux adaptés à faire tout le travail. Peut-être quelque chose comme R ou un SGBD. Cela dépend de ce que vous voulez faire avec les données.

Pour simplement prendre un tas de fichiers texte différents et de réorganiser et de sélectionner des colonnes, je saute immédiatement à Perl. D'autres utiliseraient awk.

Étant donné que des outils tels que awk et Perl peuvent traiter des fichiers lignes par ligne et n'ont pas besoin de tout stocker en mémoire, ils peuvent traiter d'énormes fichiers qui choisiraient d'autres outils. Ils peuvent aussi être étonnamment rapides.


Juste pour le plaisir, un exemple

Avec ces données

Apples,27,500,10.2,fruit,100,200,300
Chairs  1   501 123.78  furniture 101   201 301
Europe, 655, 502,0.0001,continent,   102, 202,302 

nous pouvons produire cette sortie

fruit:Apples:10.2
furniture:Chairs:123.78
continent:Europe:0.0001

utilisation de cette commande

Perl -l -n -e "print join(':',(split(/[, \t] */))[4,0,3])" *.txt

explication

élémentce qu'il fait
-lajouter une nouvelle ligne après chaque impression
-nligne de processus par ligne mais n'imprime pas implicitement
-ece qui suit est un programme d'exécution
printimprimer le résultat de l'expression suivante
join(":" liste)créez une chaîne dans une liste, utilisez ":" entre chaque
split (/Expr/)utilisez l'expression pour diviser la ligne dans les champs
[, \t]soit une virgule, un espace ou une onglet suivi de
* (astérisque spatial)0,1 espaces ou plus
(liste)[4,0,3]sélectionnez les 4ème, 0ème et 3ème éléments d'une liste

Ce programme d'une ligne équivaut à ce qui suit, ce qui peut être plus facile à suivre

#!Perl
use warnings;
use strict;

while(<>) {  # read line by line all input or all listed files
    my @columns = split(/[, \t] */);   # split on whitespace or commas
    my @chosen = @columns[4,0,3];      # choose what to keep
    my $new_line = join(":", @chosen); # join items using colons between
    print "$new_line\n";               # print with line-separator
}

invoqué comme Perl data.pl *.txt > newdata.txt

J'aime Perl et je suis modérément familier avec un sous-ensemble, bien qu'il soit en popularité partiellement parce qu'il est facile d'écrire Perl programmes très difficiles à lire. Cependant, il a été conçu pour exactement votre cas d'utilisation. Toute personne familiarisée avec awk, python, Ruby ou l'un d'un grand nombre d'outils résoudrait cela tout aussi facilement.

62
RedGrittyBrick

Clause de non-responsabilité: Je n'ai pas vraiment essayé cela avec un fichier de 70 Go, mais j'ai fait quelques gb et plus de 4 millions de lignes.

Le flux de travail prévu pour d'énormes fichiers n'est pas de charger un fichier entier dans une feuille, mais de vous connecter au fichier.

Ouvrez l'onglet Données, sélectionnez "Dans Text/CSV", sélectionnez votre fichier. Lorsque la boîte de dialogue de prévisualisation apparaît, cliquez sur le bouton "Load" ", puis choisissez" Créer uniquement la connexion ". C'est ça. Voici un tutoriel plus élaboré: https://excel.officeTS.net/fr/examples/open-large-csv

Il pourrait y avoir des bizarreries et des difficultés à résoudre avec les transformations de la colonne, mais cela vaut la peine d'essayer si vous vous sentez beaucoup mieux dans Excel qu'avec des outils de ligne de commande.

Une autre option - si vous avez accès à l'accès, vous pouvez importer et gérer les données là aussi. Ce logiciel est le système de base de données pour les utilisateurs d'alimentation.

Cela étant dit, je choisirais Awk pour la tâche particulière. Mais vous devriez être au moins un peu confortable avec Shell alors.

15
Džuris

Si votre format de données est bien connu (CSV ou autre fichier de caractères délimité, JSON, etc.), vous pouvez généralement trouver un outil de ligne de commande à usage général pour vous aider à la mettre en question.

  • xsv est une populaire pour les données séparées par des virgules/spatiales
  • JQ est populaire pour les données JSON (téléchargement disponible ici )

xSV peut mâcher des centaines de MB par seconde Selon votre matériel et le type de requête.

9
Scott Minor

Beaucoup de bons conseils d'ailleurs sur la mécanique de l'extraction de données, mais vous aurez besoin de compétences de codage sales pour faire quoi que ce soit utile.

Les grands ensembles de données contiennent souvent des lignes corrompues, des données de Loopy, des caractères étranges, des SST au lieu de zéros et de chaque mode de formatage des problèmes. Vous devez valider et filtrer ce que vous avez. (Un exemple. Séparez un fichier en deux puis rejoignez-les. Il se peut que le plus subtil des défauts à la jointure. Peut-être que toutes les lignes normales sont CRLF, mais à la jointure à la fin de la ligne est simplement cr. Cela peut passer inaperçu ou même Cause le load-in suppose de fin de fichier!) Au minimum, je vous assurerais de sortir exactement le même nombre de lignes que vous lisez.

Toujours sur le traitement de ligne ligne, c'est très simple et en vaut la peine, d'ajouter une vérification de la santé de manière très élémentaire aux données. Même si un champ n'est pas sorti, s'il est facile de vérifier, faites-le, car cela pourrait indiquer des problèmes plus subtils. Sachez que les données réelles peuvent ne pas être conformes aux spécifications officielles. Pourquoi un prix de -1 apparaît-il parfois? Un champ particulièrement utile à vérifier est le dernier qui devrait toujours avoir quelque chose en elle ou le dernier dans chaque rangée.

Être en train de traiter quelque part. De cette façon, vous pouvez définir le processus en cours d'exécution et aller déjeuner. Vous avez un enregistrement de quelle version de votre programme a été utilisé pour créer les sorties. Bien sûr que vous recherchez "... des lignes rejetées: 0 'tout le temps.

Les lignes de mauvaises sources doivent être émises dans un fichier d'échec. (Mais cesse après 15 lignes.) Vous pouvez examiner visuellement une petite quantité de données pour voir quel type d'étrangeté que vous avez.

Il se peut que l'intérieur de la boucle qui traite chaque ligne, vous devez appliquer des filtres. Cela peut ne pas arriver au premier passage, mais comme l'analyse en aval progresse peut être invitée à donner un ensemble de données plus sélectionné. Par exemple. Exclure les lignes avec des produits avec "test" dans le nom ou le code de produit en commençant par 9.

Une question de validation souvent manquée est manquante ou des données dupliquées. Par exemple, d'une manière ou d'une autre, les données brutes de vendredi ont été ajoutées à la fin des jeudis et vendredi à partir de la semaine précédente. Comment quelqu'un saura-t-il? Le réseau a échoué de 15h à 17h afin que rien n'a été enregistré. Lundi était un jour férié où il ne devrait y avoir aucune transaction, mais quelqu'un a fourni des données du lundi précédent. Vous êtes une bonne position pour faire des sommes simples, par exemple un chiffre d'affaires quotidien ou une période maximale de non-activité, etc. Ce sont des vérifications en vrac de santé mentale utilisées pour donner une pause humaine pour la pensée et la demande de vérification avant que les données empoisonnées soient passées plus loin dans la chaîne. . Ce n'est probablement pas votre travail de décider quoi faire avec un lot de Loopy, mais vous pouvez le souligner et modifier probablement votre code pour donner un meilleur ensemble de données.

Tout ce qui précède est "facile", une étape à une programmation temporelle. Vous en apprendrez sur l'automatisation, les flux de travail bien rangés, le formatage de Loopy et les anomalies de base de données. Vous serez également un peu un expert pour repérer des données inhabituelles et ce que les champs sont censés vouloir dire. Ce sera utile pour ...

Faire quelque chose d'utile avec les données. Vous devriez être impliqué dans l'analyse en aval. Cela ne veut pas vous suggérer que vous devriez créer une analyse dans votre programme de traduction, mais vous avez un cadre prêt à le faire. Les totaux, les moyennes, max et min, horaire, quotidiennes, chaque semaine sont toutes possibles des sorties faciles (NB automatisées). Vous pensez peut-être qu'une base de données est un meilleur outil, mais pour des choses fiables, le codage simple peut être meilleur. Permettez-moi de donner un exemple: lissez un ensemble de points de données. Une moyenne mobile facile est NextPoint = (lastpoint * (0,8)) + (Rawvalue * (0,2)) [ajustez .8 et .2 en fonction]. C'est bien pour des données continues, mais qu'en est-il du début des entreprises chaque jour? C'est un cas particulier où NextPoint = RAWVALUE. Quelque chose à coder peut-être.

Les valeurs de données parasites sont un bon exemple du croisement entre les données brutes crunching et analyse. Quand quelqu'un a frappé de 175 £ quand ils signifiaient 1,75 £, nous voulons vraiment inclure cela dans notre analyse? C'est un peu d'art, ou de fudge, mais le processeur de données brutes peut facilement calculer une écart moyen et type pour quelques milliers de points de données, soit une distribution réelle pour toutes les lignes de données. Vous/peut/souhaitez lancer, marquer, mettre en surbrillance ou attirer l'attention sur des valeurs inattendues à la phase de croupage des données ou l'utiliser pour informer l'étape d'analyse. Ajoutez peut-être une autre colonne avec un blanc pour OK et 'H' pour plus de temps que prévu et ainsi de suite.

Vous deviendrez un artisan qualifié, capable de transformer un énorme arbre en planches utiles du début à la fin. Vous apprendrez qui souhaite ce type de planches dans quel but et être capable de voir le bois cru de la bonne façon d'éviter les scissions et les tremblements. De plus, si vous repérez un arbre malade, vous pouvez augmenter l'alarme.

4
Peter Fox

Au cas où vous ne vous dérangerez pas de jeter quelques dollars à la solution, alors que l'EMEDITOR peut gérer des fichiers texte extrêmement volumineux dans une interface Notepad ++. J'avais l'habitude d'utiliser cela dans une entreprise d'eDiscovery qui devait travailler avec de très grands ensembles de données et il était suffisamment convivial pour que les parajuristes soient utilisés.

0
Iain Bagnall