Transponer datos de encabezado y concatenar archivosTengo un conjunto de archivos csv de datos sin procesar con metadatos en el encabezado que quiero concatenar y copiar los datos del encabezado en columnas. Pude modificar el script "combinar tablas de texto.jsl" que encontré en este sitio para extraer los datos del encabezado, transponerlos y unirlos a la tabla de datos sin procesar. Los datos del encabezado están contenidos dentro de cada archivo de datos sin procesar en las filas 2 a 29, y los transpongo para convertir la primera columna en nombres de columnas y la segunda columna en metadatos, duplicados en cada fila de datos sin procesar. Por alguna razón, solo ingresa el primer archivo y no continúa el ciclo de importación. Mi guión es el siguiente:
names default to here (1);
Clear Symbols();
//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,"/","");
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]);
// changed from item 2 to item -1
If( Item( -1, prefilelist[i2], "." ) == "txt" | Item( -1, prefilelist[i2], "." ) == "csv",
Insert Into( filelist,file),
show(file)
)
);
//filter out any non-Excel files for the file list.
For( i2 = 1, n2 >= i2, i2++,
file=(prefilelist[i2]);
If( Item( -1, prefilelist[i2], "." ) == "xls" | Item( -1, prefilelist[i2], "." ) == "xlsx",
Insert Into( filelist,file),
show(file)
)
);
//Create raw data table:
nf=nitems(filelist); //number of items in the working list
For( iii = 1 , iii <= nf, iii++, //this starts the first loop
filenow = ( filelist[iii] );
fileopen=(filepath||filenow);
dt=open(fileopen,private,
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, Comma, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 1 ),
Column Names Start( 1 ),
Data Starts( 2 ),
Lines To Read( 29 ),
Year Rule( "20xx" )
)
);
//Transpose header data into new columns and create "Transposed Header Table"
dt<<( "Header table" ) << Transpose(
columns( :TTV0.000000 ),
Label( :Name( "Test Name:" ) ),
Output Table( "Transposed Header table" )
);
//New Column( "Source", Character, Nominal );
//:Source << set each value( filenow );
dt=open(fileopen,private,
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, Comma, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 1 ),
Column Names Start( 32 ),
Data Starts( 33 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
New Column( "Source", Character, Nominal );
:Source << set each value( filenow );
//Merge header table with raw data into "Combined Data Table"
dtjoined=dt<< Join(
With( Data Table( "Transposed Header table" ) ),
Cartesian Join
);
//add the current table to the bottom of the combined data table
dtjoined << Concatenate( Data Table( dt ), Append to first table );
dtjoined << Set Name("Combined Data Table");
Close(Data Table("Transposed Header table"),NoSave);
Close(Data Table("Header table"),NoSave);
dt << Run Formulas();
);//end of the first for loopCreo que el bucle se detiene debido al nombre de la tabla. Si comento "Cerrar (Tabla de datos ("Tabla de encabezado"), NoSave);" script, importa el primer archivo correctamente y luego se detiene. Si elimino el comentario, obtengo una tabla de datos con el primer conjunto de datos sin procesar y los datos del encabezado importados como se esperaba, más los datos sin procesar del segundo archivo de datos a los que les faltan los datos del encabezado. Nunca pasa de ese segundo archivo. A continuación se muestra un ejemplo que muestra cómo se formatea el archivo de datos sin procesar, con metadatos en las filas 1 a 3 y datos sin procesar comenzando en la fila 5:
| ciclo de prueba | 1 | | |
| Laboratorio | Laboratorio_A | | |
| Número de serie | 123ABC | | |
| Tiempo | Métrica A | Métrica B | Métrica C |
| 1 | 1 | 70 | 60 |
| 2 | .1 | 71 | 61.1 |
| 3 | .2 | 73 | 62,5 |
| 4 | .3 | 78 | 63,8 |
| 5 | .4 | 80 | 65,7 |
| 6 | .5 | 85 | 69.2 |
| 7 | .6 | 89 | 72.3 |
Re: Transponer datos de encabezado y concatenar archivos@mlipsitz
Su respuesta de agradecimiento no es una entrada apropiada para etiquetarla como "Solución".Los lectores deben tener un indicador de las respuestas que realmente contienen la solución.Seleccione la(s) respuesta(s) que muestran la(s) solución(es).
Re: Transponer datos de encabezado y concatenar archivosMuchas gracias ian_jmp y gzmorgan0 . Estoy de acuerdo en que estaba luchando con parte de la sintaxis y tratando de combinar código de varias fuentes. pude conseguir gzmorgan0 El código de funciona con algunos pequeños ajustes. Vea el guión adjunto. Sí, todos mis archivos tienen el mismo formato desde un sistema automatizado de adquisición de datos. ¡Gracias de nuevo por tu ayuda con esto y por la lección de sintaxis!
Re: Transponer datos de encabezado y concatenar archivosNo hay problema. Uno de mis muchos fallos es que me resulta difícil trabajar con el código de otra persona
. . .
Re: Transponer datos de encabezado y concatenar archivosLo siento @ian_jmp , debes haber publicado tu guión mientras yo editaba la publicación.
Re: Transponer datos de encabezado y concatenar archivos@mlipsitz , hay varios problemas con este script. Creo que necesitas trabajar más para aprender la sintaxis JSL básica.Sí, todos aprendemos un idioma tomando código ya escrito y modificándolo, pero necesitas algunos conceptos básicos.Por ejemplo, esta parte de su secuencia de comandos parece que estaba intentando cambiar el nombre de la tabla dt. No hay ningún lugar en su código donde haya una columna definida ::TTV0.000000, y esta transposición sería no haz lo que creo que quieres que se haga.
//Transpose header data into new columns and create "Transposed Header Table"
dt<<( "Header table" ) << Transpose(
columns( :TTV0.000000 ),
Label( :Name( "Test Name:" ) ),
Output Table( "Transposed Header table" )
);
Además, cuando se ejecuta el siguiente código, dt es la tabla de valores de datos sin procesar antes de la unión cartesiana y dtjoined es la tabla de valores con las etiquetas. Estás sobrescribiendo tablas (colisiones de nombres).
//add the current table to the bottom of the combined data table
dtjoined << Concatenate( Data Table( dt ), Append to first table );
Aquí hay un par de sugerencias:
- No haga que las tablas sean privadas hasta que su script esté escrito y ejecutándose correctamente.
- dt es simplemente una abreviatura de una referencia de tabla. Está bien reutilizar (reutilizar) un nombre de variable, pero no lo recomiendo para una tabla hasta que se cierre la tabla anterior. Utilice nombres de variables que hagan que el código sea más legible, por ejemplo dthdr para la tabla de encabezado y dtx para la tabla transpuesta.
- Cierra la mesa tan pronto como ya no sean necesarios.
- Realmente quieres unir archivos o concatenar archivos? Si cada archivo tiene las mismas métricas, entonces creo que querrás concatenar.
- Pruebe su script con un par de archivos. En otras palabras, aprenda cómo conseguir un hit antes de lanzarse hacia las vallas.
Sus declaraciones leídas no tenían sentido para su tabla de muestra.¿Estás seguro de que cada uno de los archivos tiene el mismo formato?¿O necesita buscar un patrón para determinar dónde comienzan los datos sin procesar?Este script funcionará si los formatos de archivo son fijos. El número de filas de datos sin procesar puede cambiar.Tenga en cuenta que codifiqué la lista de archivos para probar. El código para obtener los archivos parece correcto.
Names default to Here(1);
filelist = {"example1_20190214.txt", "example2_20190214.txt"};
filepath = "c:\temp\";
df = nitems(filelist);
for(iii=1, iii<=df, iii++,
filenow = filelist[iii];
fileopen=(filepath||filenow);
dthdr=open(fileopen,//private,
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, Comma, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels(0 ),
Column Names Start(0 ),
Data Starts( 1 ),
Lines To Read( 3 ),
Year Rule( "20xx" )
)
);
nc = ncol(dthdr);
dthdr << Combine Columns( Delimiter(" "), Columns(2::nc), Column Name("Info") );
dthdr << delete columns(3::nc);
//Transpose header data into new columns and create "Transposed Header Table"
dthdr<< set name( "Header table" );
dtx = dthdr << Transpose(
columns( :Info ),
Label( Column(1) ),
Output Table( "Transposed Header table" )
);
dtx << delete column (:Label);
//Close Header table
Close(dthdr,Nosave);
//New Column( "Source", Character, Nominal );
//:Source << set each value( filenow );
dt=open(fileopen,//private,
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, Comma, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 1 ),
Column Names Start( 4 ),
Data Starts( 5 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
New Column( "Source", Character, Nominal );
:Source << set each value( filenow );
//Merge Transposed Header table, dtx, with raw data table, dt
dtjoined=dt<< Join(
With( dtx ),
Cartesian Join
);
//close Transposed Header table
Close(dtx, NoSave);
//close raw data table, dt
Close(dt, NoSave);
//For the first file, keep it, it will be used to append other file
//For the other files, append then close
If (iii==1 , dtfinal = dtjoined,
//else
current data table(dtfinal);
dtfinal << Concatenate( dtjoined , Append to first table(1));
wait(0);
close(dtjoined, NoSave)
);
//no need for Run Formulas() there are no formulas in the table
); //end the for iii loop
//Give the final table a name
dtfinal << set name( "Combined Data Table");
Probé este script usando el archivo que mostraste y una modificación de ese archivo. Aquí está el resultado usando el script anterior.

Re: Transponer datos de encabezado y concatenar archivosUsando el formato en la parte inferior de su mensaje, aquí hay un código que procesará archivos .CSV en el escritorio (de una Mac)
NamesDefaultToHere(1);
// Get a list of .csv files on the desktop
fileList = FilesInDirectory("$DESKTOP");
for(f=NItems(fileList), f>=1, f--, If(!EndsWith(Uppercase(fileList[f]), ".CSV"), RemoveFrom(fileList, f)));
fileList;
// Process each .csv file
For(f=1, f<=NItems(fileList), f++,
// Get metadata (generated by JMP)
dtm = Open(
"$DESKTOP/"||fileList[f],
columns(
New Column( "Name", Character, "Nominal" ),
New Column( "Value", Character, "Nominal" ),
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Comma, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 0 ),
Column Names Start( 1 ),
Data Starts( 1 ),
Lines To Read( 3 ),
Year Rule( "20xx" )
),
Invisible
);
// Get data (generated by JMP)
dtd = Open(
"$DESKTOP/"||fileList[f],
columns(
New Column( "Time", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "Meric A", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "Metric B", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "Metric C", Numeric, "Continuous", Format( "Best", 12 ) )
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Comma, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 1 ),
Column Names Start( 4 ),
Data Starts( 5 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
),
Invisible
);
// Add the values from dtm to dtd
for (c=1, c<=NRow(dtm), c++,
vals = {}; for(r=1, r<=NRow(dtd), r++, InsertInto(vals, Column(dtm, 2)[c]));
dtd << newColumn(Column(dtm, 1)[c], Character, Values(vals));
);
Close(dtm, NoSave);
// Append tables
if(f==1,
dtFinal = Eval(dtd << GetScript),
dtFinal << Concatenate(dtd, AppendToFirstTable);
);
Close(dtd, NoSave);
);
// Tidy up dtFinal
dtFinal << ShowWindow(1);
dtFinal << setName("Final Data");
dtFinal << deleteProperty("Source");