7
votes

Quel est le moyen le plus rapide de fusionner plusieurs fichiers CSV par colonne?

J'ai environ 50 fichiers CSV avec 60 000 lignes dans chacune et un nombre varié de colonnes. Je veux fusionner tous les fichiers CSV par colonne. J'ai essayé de faire cela dans Matlab en transposant chaque fichier CSV et à ré-enregistrer sur le disque, puis en utilisant la ligne de commande pour les concaténer. Cela a pris mon ordinateur sur une semaine et le résultat final doit être transposé à nouveau! Je dois le refaire, et je cherche une solution qui ne prendra pas une autre semaine. Toute aide serait appréciée.


4 commentaires

Connaissez-vous Perl, même un peu?


Nope, aucun du tout. Je connais C et C ++.


50 fois 60000 rangées ne parlent pas beaucoup du tout. Quelle est la taille totale des données? Ne correspond-il pas à la mémoire?


Chaque fichier comporte 60000 lignes et entre 100 et 200 colonnes (varie selon le fichier). Chaque fichier est d'environ 40 à 50 Mo. Mon code MATLAB ne faisait que lire le CSV dans une matrice de cellule, la transposant et la sauvegarde. Cela a pris une semaine. J'ai ensuite concatéré tous les CSV transposés qui n'étaient qu'une minute ou deux. Je ne sais pas pourquoi c'était si lent. Je ne veux tout simplement pas le faire à Matlab de cette façon.


5 Réponses :


2
votes

Le python CSV peut être défini afin que chaque enregistrement soit un dictionnaire avec les noms de colonne sous forme de touches. Vous devriez-vous pouvoir lire dans tous les fichiers sous forme de dictionnaires et écrivez-les à un fichier extérieur qui a toutes les colonnes.

Python est facile à utiliser, il faut donc être assez trivial pour un programmeur de n'importe quelle langue.

Si vos fichiers CSV ne disposent pas d'en-têtes de colonne, ce sera beaucoup de travail manuel, cependant, alors ce n'est peut-être pas la meilleure solution.

Puisque ces fichiers sont assez gros, il est préférable de ne pas les lire toutes en mémoire une fois. Je vous recommanderais de les ouvrir uniquement pour collecter tous les noms de colonnes dans une liste et utiliser cette liste pour créer le fichier de sortie. Ensuite, vous pouvez concaténer chaque fichier d'entrée dans le fichier de sortie sans avoir à avoir tous les fichiers en mémoire.


4 commentaires

Mes fichiers ont des titres. Je veux juste que tous les fichiers concaténés horizontalement. Est-ce que cela peut rapidement pour la taille des fichiers impliqués? (Vérifiez le commentaire à la question).


@ankit: Ouais, pas de problème. Mise à jour de la réponse. (C'est un problème amusant, si j'avais eu le temps de le faire pour vous, mais je ne suis pas, je dois répondre aux clients. :-))


Hey Lennart, avant de partir, pourriez-vous simplement énumérer les noms des fonctions / méthodes que je vais avoir besoin? Je peux google leur utilisation et trouver le reste par moi-même. Merci :)


@ankit: Eh bien, tout est ici: docs.python.org/2/library/csv .html Assurez-vous d'utiliser les docs pour votre version Python. Il y a des différences subtiles entre la façon dont vous l'utilisez dans Python 2 et Python 3.



1
votes

La concaténation horizontale est vraiment triviale. Vous envisagez de savoir C ++, je suis surpris que vous utilisiez Matlab. Traitement d'un GB ou de fois de données de la manière dont vous faites devriez être de l'ordre des secondes, pas des jours.

Par votre description, aucun traitement de la CSV n'est réellement requis. L'approche la plus facile consiste à simplement le faire en RAM. P>

ofstream output("concatenated.csv");

for( int row = 0; row < num_rows; row++ ) {
    for( int f = 1; f < num_files; f++ ) {
        if( f == 0 ) output << ",";
        output << data[f][row];
    }
    output << "\n";
}


1 commentaires

Si je comprends bien, il y a certaines manipulations de CSV impliquées, ce qui signifie que vous devez également analyser le CSV. Donc cela ne suffit pas.



10
votes

[...] transposant chaque fichier CSV et réaffûtez-le sur le disque, puis en utilisant la ligne de commande pour les concaténer [...]

sonne comme transposé-chat-transpospose. Utilisez Coller pour rejoindre des fichiers horizontalement. xxx


2 commentaires

Grande solution - il peut même fusionner de très grands fichiers CSV qui ne se chargeraient même pas de la mémoire (en python par exemple). L'opération est effectuée ligne par ligne, donc pas de problèmes de mémoire.


Si vous avez besoin de la première colonne pour correspondre, il y a aussi rejoindre .wikipedia.org / wiki / join_ (UNIX)



1
votes
readers = [csv.reader(open(fn, 'r'), newline='') for fn in csv_names]
writer = csv.writer(open('result.csv', 'w'), newline='')

0 commentaires

1
votes

Utilisation Go: https://github.com/chrislusf/gleam

suppose qu'il y ait Fichier "A.CSV" a des champs "A1, A2, A3, A4, A5". P>

et assumez le fichier "b.csv" a champs "B1, B2, B3". P>

Nous voulons rejoindre les rangées où A1 = B2. Et le format de sortie doit être "A1, A4, B3". P>

package main

import (
    "os"

    "github.com/chrislusf/gleam"
    "github.com/chrislusf/gleam/source/csv"
)

func main() {

    f := gleam.New()
    a := f.Input(csv.New("a.csv")).Select(1,4) // a1, a4
    b := f.Input(csv.New("b.csv")).Select(2,3) // b2, b3

    a.Join(b).Fprintf(os.Stdout, "%s,%s,%s\n").Run()  // a1, a4, b3

}


0 commentaires