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,

1 réponse

[Dal]
Messages postés
5894
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
22 juillet 2022
1 009
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
5894
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
22 juillet 2022
1 009
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
5894
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
22 juillet 2022
1 009
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