Combina più file txt o csvQuesto script combinerà più file txt o csv in un unico file. Lo script richiede una directory di destinazione, apre il primo file e quindi aggiunge in modo iterativo i file successivi al primo utilizzando la funzione Table Concatenate.Nel file finale viene creata una nuova colonna: questa colonna conterrà il nome del file da cui proviene ciascuna riga. Se tutti i file di testo hanno gli stessi nomi di colonna (identici), tali colonne verranno impilate (concatenate) tutte in una colonna. Anche le colonne univoche verranno trasferite nel file finale.
Lo script ha diverse sezioni in blocco commentate, queste sezioni dello script potrebbero essere utilizzate per combinare più file Excel. Quando si combinano file Excel, si presume che questi file .xls o .xlsx abbiano un solo foglio di lavoro.
-------Aggiornato il 01 giugno 2016
Avevo una domanda interessante su questo script. Qualcuno aveva una pila di file CSV in cui i nomi delle colonne erano sulla seconda riga e, a peggiorare le cose, i nomi delle colonne erano delimitati da punto e virgola mentre il testo era delimitato da virgole.Un modo per risolvere questo problema consiste nell'aggiungere le impostazioni di importazione allo script.Questa è una di quelle cose che sono felice che JMP scriva per me.Ho aperto e importato manualmente il file (usando File>Apri>Apri con anteprima, quindi nella finestra di dialogo ho impostato le colonne in modo che inizino dalla seconda riga e ho aggiunto un "altro" delimitatore di ";".Dopo aver importato il file, sono andato allo script sorgente e ho trovato l'argomento Import Settings.
Per fare in modo che lo script apra questi file, ho aggiunto un'espressione, importset=expr(import settings(...paste script here...)); in alto vicino alla parte superiore della sceneggiatura. (è un'espressione perché non è utile valutare le impostazioni di importazione fino a quando non ne avrò bisogno in seguito quando apro i file.)
Quindi, in basso, ho aggiunto l'espressione all'argomento open, open(filename,importset).
NOTA IMPORTANTE: se scaricherai questo secondo script con il filtro di importazione e ti aspetti che funzioni automaticamente sulle tue tabelle CSV con formattazione insolita..semplicemente non funzionerà, devi creare le tue impostazioni di importazione e sostituirle nelle impostazioni che sono qui per esempio.
-------- C'era anche una domanda su come farlo funzionare su un MAC qualche tempo fa.
Ho aggiunto un altro bit in modo che funzioni anche su un Mac (il che significa che non l'ho testato su un PC)
If( Host is( Mac ),
filepath="/"||prefilepath,
filepath = Convert File Path( prefilepath, Windows )
);
----- Aggiornato il 10 ottobre 2016
Justin C ha notato che i nomi di file con più "." non funzionavano così bene e ha suggerito di cambiare l'"elemento" in -1 in modo che le estensioni dei file anziché il secondo elemento vengano utilizzate per le estensioni dei file. Bella correzione e un'idea importante da tenere a mente quando si lavora con i nomi dei file. Grazie Giustino!
UtilitàRe: Unire più file txt o csvSto scoprendo che le colonne non sono sempre unite correttamente nel mio caso.Qualcuno può aiutare con questo?
Ho un sacco di file che vorrei concatenare ma l'ordine delle colonne cambia occasionalmente, per esempio mostrato di seguito:
File 1-3
Ordine delle colonne (A, B, C, D, E, F, G)
File 4-100
Ordine delle colonne (A, B, C, D, E, H ,FA,SOL)
File 101-1000
Ordine colonna (A,B,C, K ,RE,MI, H ,FA, SOL, IO , J )
Mi piacerebbe combinare tutti questi file e assicurarmi che i dati di ciascuna colonna finiscano sempre nella colonna appropriata nella tabella finale.Voglio anche conservare tutti i dati (non eliminare la colonna K, lascia semplicemente tutte le righe vuote dove la colonna K non esisteva).Qualsiasi aiuto sarebbe enormemente apprezzato!
Re: Unire più file txt o csvC'è un modo per aggiungere un'intestazione in questo script?Ho circa 20.000 file con dati senza intestazioni
Re: Unire più file txt o csvCiao,
Sono nuovo nello scripting JMP. Per qualche motivo l'impostazione di importazione non funziona per me quando unisco più file di testo. Posso vedere i file concatenati. Nel mio caso ho il nome della colonna che inizia da 11 e i dati iniziano da 12. Ma i file combinati iniziano dalla colonna 1 invece di iniziare da 11. Si prega di avvisare cosa mi manca?
Grazie
Re: Unire più file txt o csvHo creato una soluzione per questo che comporta la copia dei file nella directory temporanea e la ridenominazione. Non riesco a vedere alcun mezzo per allegare un file, quindi ecco il codice
names default to here (1);
Clear Symbols();
//Import settings, sometimes CSV files aren't exaclty formatted as CSV. Add import settings
//This is an expression to use later in the Open argument.
//Column names start on the second row, and are semicolon delimited
importset=expr( Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Comma, Other( ";" ), CSV( 0 ) ),//use ";" as a delimiter too
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 1 ),
Column Names Start( 2 ),//starting on second row
Data Starts( 3 ),//data starts on 3rd row
Lines To Read( "All" ),
Year Rule( "20xx" )
));
//set up variables with starting values
filelist={}; //empty list
//launch dialog to get the file location
prefilepath = munger(Pick Directory( "Browse to the Directory of the .txt / .csv files " ),1,"/","");
If( Host is( Mac ),
filepath="/"||prefilepath,
filepath = Convert File Path( prefilepath, Windows )
);
prefilelist = Files In Directory( filepath );
n2=nitems(prefilelist);
//filter out any non-txt or csv files
For( i2 = 1, n2 >= i2, i2++,
file=(prefilelist[i2]);
If( Item( 2, prefilelist[i2], "." ) == "txt" | Item( 2, prefilelist[i2], "." ) == "csv",
Insert Into( filelist,file),
show(file)
)
);<BR />
nf=nitems(filelist); //number of items in the working list
tempDir = "$TEMP\JMP\";
Create Directory(tempDir); //create the temp folder in the "%temp%" windows directory
//for each .csv file found on the server
For( i3 = 1 , i3 <= nf, i3++,
copyFileName = filelist[i3];
csvPos = Contains(filelist[i3],".csv"); //determine where in the filename .csv is
newFileName = Left(copyFileName, csvPos + 3 ); //determine the filename without the extra bits after .csv
Copy File (filepath||filelist[i3], tempDir||copyFileName);//copy the file to the temp folder
Rename File (tempDir||copyFileName, newFileName);//rename the file without the extra bits after .csv
filelist[i3] = newFileName; //replace the reference in the array to this file
);//end of the for loop
cctable= New Table( "Combined data table ");//make an empty table
cctable<<NEW column=""></NEW>Re: Unire più file txt o csvHo qualche problema a farlo funzionare.Penso che il problema sia che sto usando file che sono essenzialmente file di testo delimitati da virgole ma con estensione .log.
Ho cambiato il txt in un log nel tuo codice in:
Item( -1, prefilelist[i2], "." ) == "log"
ottengo un errore di
Send Expects Scriptable Object in accesso o valutazione di 'Send' , dt << /*####*/Run Formulas() /*####*/
A:
dt<< esegue formule();
Se cambio le estensioni dei miei file in .txt, funziona.Tuttavia ho migliaia di file che voglio combinare e dozzine vengono aggiunti ogni giorno. C'è un modo per farlo funzionare con i file che hanno un'estensione .log?
2a domanda.
I miei file non contengono intestazioni.C'è un modo per combinare i file e aggiungere intestazioni alla tabella dei dati?Attualmente prende la riga superiore del primo file e ne fa un'intestazione, che è tutti i dati.
Grazie per qualsiasi aiuto.
Re: Unire più file txt o csvVoglio solo dire grazie Byron. Questo è un ottimo e pratico esempio.
Questo script mi fa risparmiare così tanto tempo!!!
Quella sceneggiatura fa in pochi secondi ciò che mi richiedeva ore e ore di lavoro.
Grazie!!!
Re: Unire più file txt o csv<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Lo stesso approccio funzionerà con "join". Basta provare a sostituire l'argomento concat con un argomento join.(fai il join manualmente, quindi copia e lo script Source nella tabella risultante per un esempio di come dovrebbe apparire l'argomento join
Re: Unire più file txt o csvC'è un modo semplice per combinare più file txt o csv fianco a fianco usando JOIN invece di combinarli verticalmente con Concatenare In Combina txt Tables.jsl ?
Re: Unire più file txt o csvCiao Byron, questo script funziona alla grande. Ho modificato leggermente per selezionare un sottoinsieme dei dati dai file aperti, aggiungere colonne, cambiare i caratteri in numerici, ecc. Una domanda che avevo, c'è un modo semplice per modificare lo script per specificare la cartella in cui si trovano i file e non avere un prompt pop-up?
Grazie
ST
Re: Unire più file txt o csvQuesto script non funziona sul mio sistema: Mac OS X 10.10.5 + JMP Pro 12.1.0
Re: Unire più file txt o csvsì, il riferimento negativo è utile e funziona in quasi tutte le funzioni che fanno riferimento alla posizione del carattere, così come in alcuni punti che potresti non aspettarti; ad esempio, immagina di avere -1 cifre decimali.
Re: Unire più file txt o csvCiao Bryon e tutti,
Sono stato in grado di aggiungere un piccolo aggiornamento: rimuovi le estensioni di file finali come .csv o .txt dal nome della colonna di origine:
quindi nell'ultima sezione invece di:
imposta ciascun valore (filenow)
Ho aggiunto :
imposta ciascun valore (rimuovi (filenow,-4,-1))
Sono rimasto sorpreso dal fatto che il riferimento negativo abbia funzionato!
Re: Unire più file txt o csvCiao Byron,
Bella sceneggiatura e funziona come un fascino in JMP 12. Mi chiedevo un buon modo per iniziare a leggere i file di dati di origine da una riga specifica, troncare le informazioni di intestazione se lo desideri.Ad esempio, iniziare con la riga che inizia con la parola "CH" se il formato di tutti i file di origine sarà lo stesso?
Re: Unire più file txt o csvCiao Byron,
Succede solo in questo copione. Mostra l'errore vuoto "NItem ()" nella finestra di registro dopo aver eseguito lo script. Quindi copio l'intero script e lo incollo nella nuova finestra dello script, quindi funziona correttamente.
Grazie
Re: Unire più file txt o csvNon sono sicuro di aver capito la domanda. Questo comportamento è replicato con altri script?
Re: Unire più file txt o csvCiao Byron,
Grazie per questo prezioso script. Sto usando questo script per aggiungere più file .txt. Ma è in esecuzione dopo aver copiato lo stesso script in un nuovo script. Voglio chiedere perché non è in esecuzione quando si apre lo stesso script al primo tentativo. Grazie per la risposta in anticipo. Questo script è molto utile.
Re: Unire più file txt o csvSean,
Sul MAC, la finestra di dialogo per selezionare una directory o per selezionare un file è identica. Lo script ti sta cercando per identificare una directory contenente file csv e/o txt. Lo script attualmente consente la concatenazione di entrambi i file csv e txt nell'elenco dei file. Se vuoi che sia più restrittivo, modifica semplicemente il tipo di file che desideri escludere da questa parte dello script.
//filter out any non-txt or csv files
For( i2 = 1, n2 >= i2, i2++,
file=(prefilelist[i2]);
If( Item( 2, prefilelist[i2], "." ) == "txt" | Item( 2, prefilelist[i2], "." ) == "csv",
Insert Into( filelist,file),
show(file)
)
);
Ciò che sarebbe interessante è se lo script restituisse un elenco delle estensioni di file nella directory selezionata e quindi consentisse all'utente di spuntare i tipi di file da aggiungere alla variabile filelist.
Se hai tempo per fare un po' di scripting, per favore pubblica lo script aggiornato!
Distinti saluti,
Byron
Re: Unire più file txt o csvBryan,
Uso JMP 10.0.0 su OS X 10.10.2. Ci sarà una finestra lanciata quando eseguo lo script per selezionare i file. Tuttavia, non riesco a selezionare alcun file .txt o .csv nella finestra avviata. Non sono sicuro che lo script necessiti di un'ulteriore revisione per JMP (OS X ver.). Potresti aiutare a risolvere questo problema? Grazie.
Sean
Re: Unire più file txt o csvGrazie, ora ho capito.
Re: Unire più file txt o csvDale,
Ti dispiacerebbe controllare di nuovo l'allegato?
L'ho riattaccato.
-Byron
Re: Unire più file txt o csvDov'è la sceneggiatura?Non riesco a trovarlo da nessuna parte.