Extraiga y concatene archivos csv de carpetas que tengan la misma estructura<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola,
Tengo un montón de archivos csv en diferentes carpetas que tienen un nombre común y el archivo csv está en la misma estructura, por ejemplo.
<1ra carpeta>dfgdwgssd
<2da carpeta que tiene un nombre común> commonname
xxx-nombrecomún.csv
Estoy pensando en usar un script para extraer y concatenar todos los archivos csv. Encontré una manera fácil con los comandos bash (bucle "for" junto con "buscar"), ¿alguien podría echarme una mano? ¡Muchas gracias!
Re: Extraer y concatenar archivos csv de carpetas que tengan la misma estructura¡Gracias de nuevo, Phil!
Estoy usando Mac, y acabo de buscar en Google, encontré poca información sobre cómo ejecutar Shell desde JMP, ¿tiene algunos ejemplos?
Re: Extraer y concatenar archivos csv de carpetas que tengan la misma estructura¡Claro que placer! Estaba tratando de señalar que aún podría usar JMP para recuperar la lista completa de archivos y luego usar REGEX para buscar los nombres de archivo que contienen . De hecho, puedo imaginar que con más de 1300 carpetas podría llevar algún tiempo.
Un par de consejos sobre la velocidad:
- La impresión en el registro ralentiza las cosas.
- Además, primero abriría todos los archivos antes de concatenar y cerrar cada uno.
*Si está utilizando una Mac, puede iniciar un script de shell desde JMP. En Windows, a menos que esté usando Cygwin o algo así, Powershell es una buena opción para escribir procedimientos de utilidad que se pueden llamar desde JMP.
phil
Re: Extraer y concatenar archivos csv de carpetas que tengan la misma estructurahola phil,
¡Muchas gracias por tus consejos! Sin embargo, no ejecuté tu script.
Estaba usando una pequeña cantidad de carpetas para probar y me di cuenta más tarde de que tomó mucho tiempo con una gran cantidad de carpetas (digamos> 1,300), ya que JMP irá al segundo directorio y extraerá el archivo * .csv y así sucesivamente, muy, muy tiempo. aunque consumiendo.
Para mejorar la eficiencia, pensé en usar bash para mover todos los archivos csv a una carpeta y luego concatenarlos. Una verificación rápida para usar bash para hacer esto (extraer y concatenar archivos csv) con >1300 carpetas me tomó 3 segundos con un archivo csv concatenado de 13 MB, ¡3 segundos! Tendré que buscar la posibilidad de ejecutar el comando bash dentro de JSL.
por cierto,
dt = Open( dirpath || TheFileList,invisible );
no aparecerá la tabla de datos durante el procesamiento
¡Gracias de nuevo!
Re: Extraer y concatenar archivos csv de carpetas que tengan la misma estructuraHola jyw ,
Además de la sugerencia de Jim, puede probar el siguiente enfoque generalizado para seleccionar los archivos que desea. Vea a continuación, por ejemplo:
allFiles = FilesInDirectory("$Documents", recursive);
selectedFiles = {};
commonName = "BrownP";
For( i = 1, i<=NItems(allFiles), i++,
If( !IsMissing( Regex(allFiles, EvalInsert(".*<COMMONNAME>.*\.csv","<",">" )) ),
InsertInto(selectedFiles, allFiles);
)
);</COMMONNAME>
1. Recupere todos los nombres de archivo en la carpeta Mis documentos y sus subcarpetas. (Reemplace con la ruta de la carpeta de nivel superior).
2. Cree una lista vacía para almacenar los nombres de archivo que desee.
3. Defina la cadena commonName.
4. Recorra todos los nombres de archivo, seleccionando solo los que coincidan con el patrón y guárdelos en el archivos seleccionados lista. En este ejemplo Estoy recuperando todos los archivos CSV que contienen "BrownP" en el nombre del archivo. (Reemplace con su propia cadena commonName).
Entonces, la implementación completa (usando el código de Jim de la publicación anterior):
Names Default To Here( 1 );
// Setup an empty table to start to concatenate other tables to
dtbase = New Table( "Base Table" );
// Have the user select the starting folder
dirpath = Pick Directory( "Pick the Top Level Directory" );
// Get all of the files in all of the folders that are under the picked folder
TheFileList = Files In Directory( dirpath, "recursive" );
// Define common string to search for
commonName = "file";
// Go through all of the files and read in append those that meet your
// requirement. You will need to amend the IF statement to meet your criteria
For( i = 1, i <= N Items( TheFileList ), i++,
If( !Is Missing( Regex( TheFileList, Eval Insert( ".*<COMMONNAME>.*\.csv", "<", ">" ) ) ),
dt = Open( dirpath || TheFileList );
dtbase = dtbase << concatenate( dt, append to first table( 1 ) );
Close( dt, nosave );
)
);</COMMONNAME>
¡Espero que esto ayude!
Mejor,
phil
Re: Extraer y concatenar archivos csv de carpetas que tengan la misma estructura
Names Default To Here( 1 );
// Setup an empty table to start to concatenate other tables to
dtbase = New Table( "Base Table" );
// Have the user select the starting folder
dirpath = Pick Directory( "Pick the Top Level Directory" );
// Get all of the files in all of the folders that are under the picked folder
TheFileList = Files In Directory( dirpath, "recursive" );
// Go through all of the files and read in append those that meet your
// requirement. You will need to amend the IF statement to meet your criteria
For( i = 1, i <= N Items( TheFileList ), i++,
If( Uppercase( Word( -1, TheFileList[i], "." ) ) == "CSV" & Is File( dirpath || TheFileList[i] ) == 1,
If( Contains ( TheFileList[i], "<2nd folder common name"),
If( Contains (TheFileList[i],"<COMMON name="" of="" the="" csvfile="">"),
print(TheFileList[i]);
dt = Open( dirpath || TheFileList[i] );
dtbase = dtbase << concatenate( dt, append to first table( 1 ) );
Close( dt, nosave );
);
);
);
);</COMMON>
agregue dos líneas más para que funcione, sin embargo, la alineación / sangría debe ajustarse.
¡Gracias!
Re: Extraer y concatenar archivos csv de carpetas que tengan la misma estructurasí, sé cuál es el "nombre común" tanto para la segunda capa como para los archivos csv. ¡Gracias!
Re: Extraer y concatenar archivos csv de carpetas que tengan la misma estructura¿Sabes de antemano cuál es el "nombre común"?¿O necesita que el guión lo resuelva?Y en ese caso, ¿habrá más de un posible nombre común en la carpeta?
Re: Extraer y concatenar archivos csv de carpetas que tengan la misma estructuraHola Jim,
Lo hice funcionar, pero enumeró todos los archivos CSV, estoy tratando de encontrar la manera de ordenar o especificar la segunda capa. ¿podrías por favor dar un poco más de consejos?
¡Gracias!
Re: Extraer y concatenar archivos csv de carpetas que tengan la misma estructuraAquí hay un script que debería darle un buen comienzo:
Names Default To Here( 1 );
// Setup an empty table to start to concatenate other tables to
dtbase = New Table( "Base Table" );
// Have the user select the starting folder
dirpath = Pick Directory( "Pick the Top Level Directory" );
// Get all of the files in all of the folders that are under the picked folder
TheFileList = Files In Directory( dirpath, "recursive" );
// Go through all of the files and read in append those that meet your
// requirement. You will need to amend the IF statement to meet your criteria
For( i = 1, i <= N Items( TheFileList ), i++,
If( Uppercase( Word( -1, TheFileList[i], "." ) ) == "CSV" & Is File( dirpath || TheFileList[i] ) == 1,
dt = Open( dirpath || TheFileList[i] );
dtbase = dtbase << concatenate( dt, append to first table( 1 ) );
Close( dt, nosave );
);
);