Importa un set di file di testo in un set di colonne


0

Ho una serie di file di testo denominati outfile00.txtfino a outfile297.txt. Ogni file ha un numero (decimale o meno) su ogni riga tranne il primo (che è come un'intestazione).

Devo importare il contenuto di ciascun file in una colonna a partire dalla colonna A (che corrisponderà a outfile00.txt) fino a quando tutti i file di testo sono stati importati.

Ecco un esempio dell'inizio di outfile00.txt:

KP=0.50 ,Ki=0.10 ,Kd=0.05
0.00
0.00
0.00
0.00

Il file attuale ha circa 1500 righe. Ho provato a importare manualmente il file di testo utilizzando la scheda Dati; Excel non ha problemi e il testo viene importato.

Come posso importare tutti i file di testo come batch?

MODIFICARE

Credo di non aver definito chiaramente il mio problema, quindi ecco alcuni dettagli extra.

Per quanto riguarda il metodo di cybernard ,

Se creo un file di valori separato da tabulazioni (il carattere di tabulazione è compreso tra la lettera e il numero su ciascuna riga) come segue,

a   1
b   2
c   3
e   4
f   5
g   6

Posso importare direttamente il file di testo e ottenere quanto segue,

File di valori separati da tabulazione importati

Speravo di creare un file simile al suddetto file TSV. Un esempio potrebbe essere il seguente,

KP=0.50 ,Ki=0.10 ,Kd=0.05   KP=0.50 ,Ki=0.10 ,Kd=0.10   KP=0.50 ,Ki=0.10 ,Kd=0.15
0.00    117.00  123.00
0.00    118.00  124.00
0.00    119.00  125.00
0.00    120.00  126.00

che produce i seguenti risultati di importazione,

Risultati importati dal file TSV generato

Devo sapere come posso generare un tale file TSV dai miei file di origine.


Hai mai "registrato" una macro? È necessario, se non già, abilitare la scheda Sviluppatore in Excel. Una ricerca su Google risolverà la scheda su come. L'ho fatto così tanto tempo fa che non ricordo come abilitare quella funzione. Se sai già come registrare una macro, allora si tratta di creare un'istanza di una variabile di conteggio; utilizzare un contatore con una macro registrata per l'importazione di un file di testo. Premi record, esegui una singola importazione esattamente come lo desideri. Premi stop. La tua macro è ora registrata. Alt + F11 per esaminare il codice. Modifica il codice Test. Risoluzione dei problemi.
ejbyte il

Ecco un altro suggerimento: dim counter come intero, dim mystring come String, counter = 1, mystgring = "C: / file" & cstr (counter) & ".txt" ... se counter <100 "file" & "00" & cstr (counter) & ".txt". Questo suggerimento dovrebbe aiutarti a capire uno script da configurare nella tua Macro. Come "per loop vba", "counter loop".
ejbyte il

Risposte:


1

È possibile utilizzare Power Query per combinare tutti i file in una cartella. Power Query è un componente aggiuntivo gratuito di Microsoft per Excel 2010 e 2013 ed è integrato in Excel 2016 come Get and Transform.

Ken Puls ha un tutorial dettagliato qui .

Dopo aver impostato la query, i file possono essere aggiunti o rimossi dalla cartella e la query può essere aggiornata con il clic di un pulsante.


Grazie. Ho letto il tutorial ma non riesco a cambiare ogni file in una colonna diversa. A peggiorare le cose, il tutorial menzionato fnGetFileContents([Folder Path]&[Name])nella colonna personalizzata quando dovrebbe essere File.Contents([Folder Path]&[Name]). Ho passato un po 'di tempo a risolverlo. Mi sento come se fossi vicino alla soluzione, anche se riesco a capire di avere ogni file nella sua colonna.
Khalid Hussain,

Segui il tutorial. Funziona se segui i passaggi. Prenditi il ​​tuo tempo.
teylyn,

0

I primi 00 dovranno essere rinominati 0. Potrebbe essere necessario rimuovere altri 0 offset. Ad esempio 01,02,03 non funzionerà, rinominalo in 1,2,3.

dal prompt dei comandi vai nella cartella contenente tutti i tuoi file.

FOR / L% i IN (0,1,297) DO digitare outfile% i.txt >> master.txt

Questo dovrebbe combinare tutti i tuoi file in master.txt.

Quindi vuoi un tasto tab tra i file. Nel blocco note, crea un file che contiene una singola scheda denominata tab.txt dopo averlo salvato assicurati che abbia una dimensione di 1 byte e che tu abbia accidentalmente colpito altri caratteri.

FOR / L% i IN (0,1,297) DO digitare outfile% i.txt tab.txt >> master.txt


Per eliminare il fastidio di rinominare tutti i file: È possibile utilizzare anche qualcosa del genere: IF% i LSS 10 (digitare outfile00% i.txt) ELSE IF% i LSS 100 (digitare outfile0% i.txt) ELSE (digitare outfile% i .txt)
ejbytes

Penso che questa soluzione funzionerebbe se potessi aggiungere i file dopo un carattere di tabulazione. Da quello che ho capito, si accumula solo un file dopo l'altro, quindi finisco con un file master davvero lungo. Ho già avuto un file principale.
Khalid Hussain,

@KhalidHussain ha aggiornato la mia risposta in modo da poter avere il tuo personaggio TAB.
cybernard,

@cybernard, ho aggiornato la mia risposta per chiarire dove TABdovrebbe essere il personaggio. Spero di averti capito correttamente.
Khalid Hussain,

0

D: Devo sapere come posso generare un tale file TSV dai miei file sorgente.

Sapevi che esiste un comando solo per quello?

paste outfile*.txt > out.txt

Se vuoi scrivere il tuo algoritmo, scegli la lingua (di scripting) che preferisci.

  1. awk: awk -f awk.awk outfile*.txt > out.txt

    BEGIN {count = 1}
    FNR == 1 && FNR < NR {count++}
    
    {
      if ( _[FNR] ) {
        while ( c[FNR] != count-1 ) {
          _[FNR] = (_[FNR] " " sprintf("%8s",""))
          c[FNR]++
        }
        _[FNR] = (_[FNR] "\t" sprintf("%-8s",$0))
        c[FNR]++
      }
      else if ( count == 1 ) {
        _[FNR] = sprintf("%-8s",$0)
        c[FNR]++
      }
      else {
        while ( c[FNR] != count-1 ) {
          if ( _[FNR] )
            _[FNR] = (_[FNR] " " sprintf("%8s",""))
          else
            _[FNR] = sprintf("%8s","")
          c[FNR]++
        }
        _[FNR] = (_[FNR] "\t" sprintf("%-8s",$0))
        c[FNR]++
      }
    }
    
    END {
      for (i=1; i<=length(_); i++)
        print _[i]
    }
    
  2. perl: perl perl.pl > out.txt

    use strict;
    use warnings;
    
    my $i;
    my @rows;
    my @files = map { "outfile$_.txt" } 0 .. 297;
    
    foreach my $file (@files) {
        open my $infh, '<', $file or die $!;
        $i=0;
        while (<$infh>) {
            chomp;
            my $data = $_;
            if (length $rows[$i]) {
                $rows[$i++] .= "\t" . $data;
            } else {
                $rows[$i++] = $data;
            }
        }
    }
    
    foreach my $row (@rows) {
        print "$row\n";
    }
    

PS Nel caso ti stia chiedendo, bash, awk e perl sono disponibili su diverse piattaforme, tra cui Windows ( cygwin è la mia raccomandazione lì).

Aggiornamento: ecco i file di input che ho usato, insieme all'output di paste outfile*.txt > out.txtsu Git per Windows .

==> outfile00.txt <==
KP=0.50 ,Ki=0.10 ,Kd=0.05
0.00
0.00
0.00
0.00

==> outfile01.txt <==
KP=1.50 ,Ki=1.10 ,Kd=1.05
1.00
1.00
1.00
1.00

==> out.txt <==
KP=0.50 ,Ki=0.10 ,Kd=0.05       KP=1.50 ,Ki=1.10 ,Kd=1.05
0.00    1.00
0.00    1.00
0.00    1.00
0.00    1.00

Interessante, anche se non produce il risultato che desidero. Ho anche provato con la --serialbandiera. Stai ottenendo risultati diversi? Sto usando il pastefornito con Git Bash per Windows.
Khalid Hussain,

Potrebbe essere dovuto al gran numero di file? Prova prima con pochi. Esistono tre soluzioni pubblicate qui e tutte sono state testate con i dati di esempio forniti. Ti suggerisco di arricchire la sezione che ho provato nella tua domanda che mostra i vari output in modo che tutti possiamo vedere dove ti sei bloccato. Lo stesso per le risposte di ejbyte e teylyn.
simlev,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.