opendatasicilia / tansignari

"T'ansignari e t'appeddiri"
http://tansignari.opendatasicilia.it
Creative Commons Attribution 4.0 International
18 stars 10 forks source link

creare unico file CSV con campo nome file #185

Closed pigreco closed 3 years ago

pigreco commented 3 years ago

Ho molti file CSV con nome xxxxxx_yyyy.csv dove:

come generare unico file CSV (hanno tutti la stessa struttura) e aggiungere un campo nome_file di provenienza?

dennisangemi commented 3 years ago

Io lo farei in R (che sto provando ad imparare da un po') con uno dei seguenti metodi:

o in python:

aborruso commented 3 years ago

Ciao @pigreco per queste cose uso Miller:

mlr --csv put -S '$file=FILENAME' *.csv >output.csv

Verrà aggiunto il campo file, con il nome del file.

pigreco commented 3 years ago

grazie @dennisangemi se guardi le ricette di t'ansignari vedrai che usiamo quasi sempre la riga di comando e utility come Miller, visidata, ecc... usare R per fondere dei file è come sparare a una mosca con il bazooka. Python invece sarebbe una bella soluzione da adottare, ma occorre studiare oppure scrivere, come fa @aborruso , l'intero script.

grazie

aborruso commented 3 years ago

usare R per fondere dei file è come sparare a una mosca con il bazooka.

Se ce l'hai installato e lo usi, fare un merge con R è una cosa comoda e leggera. Insomma dipende sempre dalla propria cassetta degli attrezzi.

Ma è vero che uno strumento da cli per cose come queste è spesso imbattibile in immediatezza e nell'essere by default in un certo senso per tutte/i.

pigreco commented 3 years ago

@aborruso @dennisangemi io uso quotidianamente QGIS e potrei farlo con questo software, ma ormai la mia mente pensa subito alla cli e non più alla gui. image

gabacode commented 3 years ago

Io lo farei così con Python e pandas:

import os
import pandas as pd

# Lista vuota che conterrà i files
files = []
# Il path dove si trovano i files csv, in questo caso nella stessa cartella
path = '.'
# Il nome del file aggregato
output = 'joined'

# Per ogni file contenuto nella cartella stabilita
for file in os.listdir(path):
    # Se è un csv e non si tratta del file unico
    if (file.endswith('.csv')) and (not file.startswith(output)):
        # Aggiungi alla lista dei files
        files.append(file)

# Per ogni file contenuto nella lista
for file in files:
    # Leggi il csv in un dataframe
    df = pd.read_csv(file)
    # Aggiungi colonna con nome file
    df['nome_file'] = file
    # Appendi al file aggregato
    df.to_csv(output+'.csv', mode = 'a', index = None, header = False)

L'ultimo comando df.to_csv è personalizzabile se si vuole l'index e l'header. Altre opzioni sono consultabili qui.

dennisangemi commented 3 years ago

Io lo farei così con Python

Lui è veramente addicted ;)

pigreco commented 3 years ago

@aborruso , appena testata la tua soluzione, è una bomba, semplice e veloce.

Poi proverò le altre soluzioni.

pigreco commented 3 years ago

ricetta pubblicata, chiudo issue grazie a tutti

https://tansignari.opendatasicilia.it/ricette/csv-tsv/fondere_csv_nome_file/