Come utilizzare la ricorsione nel concatenare file CSV nelle cartelle?Ciao, qualcuno può aiutarmi a modificare questo codice?Sto cercando di concatenare file CSV per cartella. L'utente dovrà selezionare una cartella e tutte le cartelle CSV qualificate verranno concatenate e salvate in base al nome della cartella. Questo metodo fa sì che l'utente scelga una cartella per ogni esecuzione dello script.
Tuttavia, quello che sto cercando di fare ora è fare in modo che l'utente scelga la cartella principale, quindi esegua lo script e concatena i dati per sottocartelle (salvandoli individualmente con il nome della cartella come nome file come nel metodo precedente).
Ma con questo codice, tutti i file CSV vengono concatenati in un unico file. Puoi aiutare a modificare e spiegare come funziona il ricorsivo? E come posso salvare questi file individualmente (concatenare i dati per cartella) semplicemente aprendo la cartella principale. Sto usando JMP 15. Grazie
p = pick Directory("Select a Folder");<BR />//f = Files In Directory(p);
f = Files In Directory(p, recursive(1));
Dir = Word(-1, p, "/"); //get filename
saveDir = Substr( p, 1, Length( p ) - Length( Word( -1, p, "\/" ) ) - 1 ); //save file outside main folder
/* Removes the file names from the list f which are not CSV files */
for(j=1,j<=N Items(f),j++,
If (Substr(f[j],Length(f[j])-2,3)!= "CSV",
RemoveFrom(f,j,1);
j=j-1;
);
);
A = {}; /* creates a empty list for storing the names of each data table */
B = {};
C = {};
D = {};
k = {};
m = {};
/*Opens each one of the CSV files and deletes all unwanted rows */
for(j=1,j<=N Items(f),j++,
CSV = Open(Concat(p,f[j]), End of Field(comma), Strip Quotes(1), Labels(1),
Column Names Start(3), Data Starts(4), Columns(:MRR=Numeric));
colname = {};
colname = CSV<<GET column="" names="">20 & Contains(colname,"Weight")>50,
InsertInto(A,CSV);
CSV<<SELECT where="">1,
dt2 = dt1<<CONCATENATE>1,
dt3 = dt1<<CONCATENATE></CONCATENATE></CONCATENATE></SELECT></GET>Automazione e scriptingRi: Come utilizzare la ricorsione per concatenare i file CSV nelle cartelle?Cosa ti serve spiegato sull'opzione ricorsiva (1)?
Names Default To Here(1);
Files In Directory("$SAMPLE_DATA", recursive(1));
Senza questa opzione otterrai solo il primo livello di file nella cartella e quando usi la ricorsione otterrai anche le sottocartelle e i file al loro interno.

Quelli evidenziati sono presenti solo perché è stato impostato recursive(1).
Per quanto riguarda il tuo script: quanti livelli di cartelle hai? potrebbe cambiare? Se sono presenti più livelli finché non vengono trovati i file .csv, quale dovrebbe essere il nome del file?
Ri: Come utilizzare la ricorsione per concatenare i file CSV nelle cartelle?Ecco uno script iniziale che legge tutti i file ricorsivi e li concatena in tabelle di dati separate, in base alla cartella in cui sono stati trovati.
Non ho incluso tutti i tuoi singoli controlli degli errori, ecc. Dovresti essere in grado di modificare il mio esempio per reinserire questi elementi nel codice.
C'è una differenza di struttura in questo codice.il JSL legge un file e quindi lo concatena prima di leggere il file successivo.Ho controllato quanto più ho potuto, ma potrebbero esserci ancora problemi.
names default to here(1);
p = pick Directory("Select a Folder");//f = Files In Directory(p);
f = Files In Directory(p, recursive(1));
for(i=nitems(f),i>=1,i--,
if(uppercase(word(-1,f[i],"."))!="CSV",
remove from(f,i,1)
)
);
// Create the Associative Array with all of the files, with their directories
// Place all data into a data table, and then move into an Associative Array which will give the
// folder(data table to concatenate to)
dt= new table("The Files", new column("File", character));
dt << add rows(nitems(f));
dt:file<<SET values=""></SET>Ri: Come utilizzare la ricorsione per concatenare i file CSV nelle cartelle?Ciao, ho solo due livelli di cartelle, la cartella principale e poi le cartelle multiple con il CSV all'interno. Ecco un esempio di output dello script senza utilizzare ricorsivo. Quello che vorrei fare è quando lo script viene eseguito, verrà selezionata solo la cartella principale e lo script avrà un output come questo.

Ri: Come utilizzare la ricorsione per concatenare i file CSV nelle cartelle?Puoi facilmente ottenere il nome della cartella usando Word() con indice negativo. Esempio qui sotto
Names Default To Here(1);
foldername = Word(-1, "F1/1.jmp", "/\"); //"1.jmp"
Molto probabilmente creerei un array associativo con le chiavi come nomi delle cartelle. Quindi vorrei scorrere l'elenco dei file e controllare se la cartella non esiste già nell'array associativo, quindi aggiungerla lì e inizializzare il suo valore come elenco vuoto. Quindi puoi utilizzare insert into per aggiungere i percorsi dei file a quell'array associativo per correggere le chiavi (usa percorsi completi in modo che sia più semplice aprire i file). Dopo aver esaminato l'elenco dei file, esegui un altro ciclo sull'array associativo. Questa volta apri i file e concatenali mentre procedi
Ri: Come utilizzare la ricorsione per concatenare i file CSV nelle cartelle?Salve, ho una domanda in questa riga di codice poiché sto ancora utilizzando JMP 15. Come posso tradurlo in JMP 15 (formato loop for) Sono un po' confuso su cosa sia {table} quando è nel formato loop for in JMP 15. Inoltre, come posso salvare questi file CSV di conseguenza? Per il mio esempio, è in base al sesso. Quindi i nomi dei file dovrebbero essere salvati in base al sesso (Male.csv e Female.csv)
For Each( {table}, theArray << get keys,
stable = theArray << get value( table );
stable = Substitute( stable, ":", "-" );
stable = Substitute( stable, "/", "-" );
If( Try( Data Table( stable ) << get name, "" ) == "",
dt = New Table( theArray << get value( table ) ),
dt = Data Table( stable )
);
Ri: Come utilizzare la ricorsione per concatenare i file CSV nelle cartelle?Penso che questo dovrebbe funzionare:
arrayKeys = theArray << get keys;
For(i=1, i <=nitems( arrayKeys), i++,
table = arrayKeys[i];
stable = theArray << get value( table );
stable = Substitute( stable, ":", "-" );
stable = Substitute( stable, "/", "-" );
If( Try( Data Table( stable ) << get name, "" ) == "",
dt = New Table( theArray << get value( table ) ),
dt = Data Table( stable )
);