Tecnicamente's Weblog

Just another WordPress.com weblog

Importare file dati in Excel

E’ indubbio che Excel come tutti i fogli di calcolo sia ormai uno strumento indispensabile nell’analisi dei dati, e sicuramente tutti vi siete trovati ad affrontare il triste problema della “virgola”.

Infatti nelle impostazioni Italiane (ma forse anche straniere), i formati decimali sono separati da “,” e non da “.” .

Questo può creare dei problemi quando si devono importare file numerici realizzati da altri software o scaricati da data-logger, proprio come era successo a me anni fa.

Il problema di per se è facilmente risolvibile quando il file da importare contiene solo numeri decimali con separazione basata su “.”, in questi casi si apre il file con un qualsiasi editor e si esegue la sostituzione automatica di “.” con “,” in tal modo il gioco è fatto e si importa direttamente in Excel un file leggibile secondo il formato che esso si attende.

Tuttavia esistono casi in cui l’operazione precedente non è possibile, in particolare quando il file da importare è mostruosamente grande, ed in tal caso occore un editor di testi serio, o quando il file contiene dati promiscui, come ad esempio il file che dovevo importare io:

000000    25/10/2004    17.07.35    21.487    1.612    26.90    27.17
000001    25/10/2004    17.17.38    21.223    1.596    26.05    27.04
000002    25/10/2004    17.27.35    20.820    1.574    25.08    25.89
000003    25/10/2004    17.37.35    19.464    1.515    23.74    24.90
000004    25/10/2004    17.47.35    16.722    1.426    22.43    23.74
000005    25/10/2004    17.57.35    11.868    1.233    21.33    22.81
000006    25/10/2004    18.07.35    6.576    0.809    20.38    21.99
000007    25/10/2004    18.17.35    2.836    0.382    19.77    21.67
000008    25/10/2004    18.27.35    0.746    0.110    19.30    21.56
000009    25/10/2004    18.37.36    0.090    0.013    19.26    21.62
000010    25/10/2004    18.47.36    0.010    0.001    18.95    21.56
000011    25/10/2004    18.57.36    0.003    0.001    18.92    21.63
000012    25/10/2004    19.07.36    0.003    0.001    19.25    21.62
000013    25/10/2004    19.17.36    0.002    0.001    19.11    21.45

Nel mio caso oltre ad essere un file piuttosto grosso,  (mesi di acquisizione dati), mi serviva modificare i separatori decimali solo dalla quarta colonna in poi, per cui il metodo pocanzi menzionato non era applicabile.

Per risolvere il problema sono bastate poche righe di codice C, dove imponevo di mutare i “.” in “,” dal secondo punto letto in poi per ogni riga.

Quindi ho prodotto il seguente codice, dove con DOT_LIMIT pari a 2 richiedo la modifica a partire dal terzo “.” letto, e DOT_UP_LIMIT pari a 6 per azzerare il contatore a fine linea.

Riposto il codice, per quanto banale  spero possa essere utile a qualcuno.

#define DOT_LOW_LIMIT 2
#define DOT_UP_LIMIT 6
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  FILE *fpin;
  FILE *fpout;

  int dot_count;
  char carattere;

  if (argc !=3 )
  {
           fprintf(stderr,"Uso: %s <file_in> <file_out>\n",argv[0]);
           exit(0);
  }

  fpin = fopen(argv[1],"r");
  fpout = fopen(argv[2],"w");

  dot_count = 0;

  while(fscanf(fpin,"%c",&carattere) != EOF ){
           if (carattere == EOF) break;
           if (carattere == '.'){
                         dot_count++;
                         if(dot_count > DOT_LOW_LIMIT){
                                     fprintf(fpout,"%c",',');
                                     fprintf(stdout,"%c",',');
                         }
                         else{
                              fprintf(fpout,"%c",carattere);
                              fprintf(stdout,"%c",carattere);
                         }
                         if(dot_count == DOT_UP_LIMIT) dot_count = 0;
           }
           else{
                fprintf(fpout,"%c",carattere);
                fprintf(stdout,"%c",carattere);
           }
  }

  fclose(fpin);
  fclose(fpout);

  return 0;
}

Ottenendo questo risultato:

 

000000    25/10/2004    17.07.35    21,487    1,612    26,90    27,17
000001    25/10/2004    17.17.38    21,223    1,596    26,05    27,04
000002    25/10/2004    17.27.35    20,820    1,574    25,08    25,89
000003    25/10/2004    17.37.35    19,464    1,515    23,74    24,90
000004    25/10/2004    17.47.35    16,722    1,426    22,43    23,74
000005    25/10/2004    17.57.35    11,868    1,233    21,33    22,81
000006    25/10/2004    18.07.35    6,576    0,809    20,38    21,99
000007    25/10/2004    18.17.35    2,836    0,382    19,77    21,67
000008    25/10/2004    18.27.35    0,746    0,110    19,30    21,56
000009    25/10/2004    18.37.36    0,090    0,013    19,26    21,62
000010    25/10/2004    18.47.36    0,010    0,001    18,95    21,56
000011    25/10/2004    18.57.36    0,003    0,001    18,92    21,63
000012    25/10/2004    19.07.36    0,003    0,001    19,25    21,62
000013    25/10/2004    19.17.36    0,002    0,001    19,11    21,45

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: