Ordonner un très gros fichier .csv par ordre croissant d'une colonne

Résolu/Fermé
Kikumachi - 4 févr. 2019 à 09:55
 Kikumachi - 5 févr. 2019 à 11:17
Bonjour,

J'ai un fichier .csv dont l'une des colonnes stocke des identifiants numériques (du genre '331506924', '442109275', etc.) et, n'étant pas très familier avec les méthodes d'édition de fichiers par algorithme, je voudrais savoir s'il existe une méthode (rapide ?) pour ordonner ce fichier par ordre croissant des identifiants.

Le problème, c'est que ce fichier est absolument énorme (plus de 30 millions de lignes), je ne peux donc pas le traiter dans son entièreté avec un logiciel tableur type Excel ou LibreOffice Calc car leur capacité mémoire sature au bout d'un million de lignes.

Dans l'idéal, existe-t-il un tableur capable de gérer d'énormes quantités de données et qui possède une fonction interne de tri selon une colonne ? Ou bien, existe-t-il un programme Python capable de réaliser cette tâche ?

Merci d'avance pour votre réponse.

Cordialement,
A voir également:

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 4 févr. 2019 à 12:51
Salut Kikumachi,

Tu devrais utiliser la bibliothèque
pandas
de Python.

Disons que la colonne que tu veux trier est dénommée "col3", que ton fichier de départ est
fichier.csv
, que celui-ci comporte une première colonne dénommée "col1" et que le fichier trié doit être
new.csv
.

Le script Python pour lire le fichier csv, le trier et sauvegarder une version triée serait :

import pandas

df = pandas.read_csv('fichier.csv', index_col='col1')
df = df.sort_values(by=['col3'], ascending=True)
df.to_csv('new.csv')

Dal
4
Bonjour,

Donc si par exemple, mon fichier initial s'appelle "FichierATrier.csv" et la colonne que je veux trier est également la première colonne nommée "IDENTIFIANT", je devrais faire un script comme ça ?
import pandas

df = pandas.read_csv('FichierATrier.csv', index_col='IDENTIFIANT')
df = df.sort_values(by=['IDENTIFIANT'], ascending=True)
df.to_csv('FichierTrie.csv')
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
4 févr. 2019 à 14:04
oui :-)
0
C'est étrange, car lorsque je lance le script, j'obtiens l'erreur suivante :

Traceback (most recent call last):

  File "<ipython-input-12-8d041d40c960>", line 1, in <module>
    runfile('C:\TraitementCRA.py', wdir=C:\')

  File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 704, in runfile
    execfile(filename, namespace)

  File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:\TraitementCRA.py", line 15, in <module>
    df = pandas.read_csv('U:\CRANonSynthetique.csv', index_col='IDENTIFIANT')

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 678, in parser_f
    return _read(filepath_or_buffer, kwds)

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 446, in _read
    data = parser.read(nrows)

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 1036, in read
    ret = self._engine.read(nrows)

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 1922, in read
    index, names = self._make_index(data, alldata, names)

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 1425, in _make_index
    index = self._get_simple_index(alldata, columns)

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 1457, in _get_simple_index
    i = ix(idx)

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 1452, in ix
    raise ValueError('Index %s invalid' % col)

ValueError: Index IDENTIFIANT invalid


Pour vous donner une idée, voilà à quoi ressemble le début de mon fichier .csv :

IDENTIFIANT;DATE;LONGITUDE;LATITUDE;TYPE
33607456106;2007-09-03 14:25:48;1.21701;49.3874;OC
33607456600;2007-09-03 12:18:51;2.32809;48.8574;IC
33607415410;2007-09-03 15:56:22;1.92624;48.5505;OC
33607415410;2007-09-03 16:31:21;2.10017;48.7957;IC
33607417591;2007-09-03 12:43:57;2.39867;48.8448;OC
33607417591;2007-09-03 12:45:16;2.39867;48.8448;IC
33607411232;2007-09-03 11:38:05;2.34388;48.9211;IC
33607411232;2007-09-03 14:04:24;2.34388;48.9211;IC
33607411232;2007-09-03 16:51:13;2.34388;48.9211;OC
33607411232;2007-09-03 16:52:04;2.34388;48.9211;IC
33607411232;2007-09-03 17:17:42;2.32644;48.8758;OC
33607410359;2007-09-03 13:32:49;2.31767;48.9023;OC
33607410359;2007-09-03 14:02:26;2.31767;48.9023;OC
33607410359;2007-09-03 14:03:51;2.31767;48.9023;OC
33607410359;2007-09-03 14:04:56;2.31767;48.9023;OC
33607410359;2007-09-03 14:06:00;2.31767;48.9023;OC
33607410359;2007-09-03 14:07:25;2.31767;48.9023;OC
33607419125;2007-09-03 14:11:47;2.42523;48.8521;OC
33607419125;2007-09-03 15:21:00;2.4252;48.8492;IC
0
Après vérification, j'avais oublié de rajouter "delimiter = ';'" dans le script.

Je l'ai fait tourner et c'est bon, merci beaucoup pour votre aide !
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
4 févr. 2019 à 16:15
de rien, bravo !

effectivement, par défaut, pandas utilise le délimiteur virgule
,
pour le format CSV (CSV signifiant d'ailleurs "comma separated values")
0