Tengo varios archivos csv que necesitan ser limpiados.Los archivos en cuestión tienen dos estructuras básicas de bloques de datos.El primer bloque consta de 1 columna con 7 filas de información.El segundo segmento contiene 6 columnas con más de 5 filas de datos.
Para el primer bloque, la transformación ideal es romper la columna en dos partes.Una pieza proporcionará el encabezado o el nombre de la columna. Y, la segunda pieza proporcionará información de datos sobre ese experimento específico.
El segundo bloque necesita una intervención mínima.
Hasta ahora, he logrado acercarme al estado deseado, con la excepción de un par de puntos molestos.Primero, dividir el archivo csv en dos partes, dos tablas, no es un problema.La primera tabla de datos –dt1- es el archivo csv original del que se extraen los datos y se eliminan algunas filas para crear una segunda tabla de datos –dt2.La segunda tabla de datos contiene la columna 1 con filas 7; que necesitan tratamiento adicional.
Para hacer esto, empiezo con una nueva tabla de datos -dt3.Logré crear los encabezados de las columnas con un For Loop y tomar el primer elemento de una lista.Esta información proviene de dt2.La siguiente parte es la que me está dando un problema.Necesito pasar o enviar el segundo elemento de la lista a la primera fila de dt3.
Primera pregunta:
¿Por qué la siguiente línea puede cambiar la primera celda de la columna 1 en la tabla de datos original (dt1) pero la siguiente pieza de código no funciona en la nueva tabla de datos?
dt1[1,1]=300; //esto funciona
dt3[1,1]=300; //esto no funciona.Produce un error.
subíndice no válido (debe ser un número o una lista de números) en el acceso o la evaluación de 'Assign', dt3[1, 1] = /*###*/300 /*###*/
Segunda pregunta
Uso : como identificador de carácter para separar las primeras siete filas en información de encabezado y datos de fila.La desventaja de este enfoque es que la fila Fecha/Hora tiene 3 de estos caracteres y los datos se pierden después de encontrar el segundo:.¿Cómo puedo evitar que esto suceda?
¿Alguna idea o sugerencia? El archivo de Excel adjunto es un ejemplo de tabla de datos.
Muchas gracias por cualquier ayuda.
Ejemplo de archivo csv original
Receta de comida: 1-Salsa espesa | | | |
Receta de licuadora: 3 velocidades | | | |
Temperatura Receta: 100 Vapor | | | |
Herrajes para cocinar: inoxidable | | | |
ID de lote: Mini-Cake-100 | | | |
ID de la muestra: Mini-Cake-100.1 | | |
Fecha/Hora: 30/6/2017 4:12:44 p. m. | | |
| | | | | |
| | | | | |
Punto | Densidad | Azúcar | Relación | X | Y |
1 | 5020.607 | 98.6872 | 0.9976 | 145 | 0 |
2 | 4976.009 | 98.1275 | 0.9955 | 108.75 | 0 |
3 | 4977.177 | 98.3677 | 0.9958 | 72.5 | 0 |
4 | 4982.821 | 98.2569 | 0.9957 | 36.25 | 0 |
5 | 4989.282 | 98.2105 | 0.9977 | 0 | 0 |
Ejemplo de tabla de datos 2 (dt2). 1 columna con 7 filas. El : separa el nombre de la columna de la información experimental.
Receta de comida: 1-Salsa espesa |
Receta de licuadora: 3 velocidades |
Temperatura Receta: 100 Vapor |
Herrajes para cocinar: inoxidable |
ID de lote: Mini-Cake-100 |
ID de la muestra: Mini-Cake-100.1 |
Fecha/Hora: 30/6/2017 4:12:44 p. m. |
Transformación deseada de dt2.
Receta de comida | Receta de licuadora | Receta de temperatura | Herrajes para cocinar | ID del lote | ejemplo de identificacion | Fecha y hora |
1-salsa espesa | 3 velocidades | 100 vapor | Inoxidable | Mini-Pastel-100 | Mini-Pastel-100.1 | ######### |
Código JSL
<BR />
Names Default To Here( 1 );
Close All(data tables);
Clear Log();
Clear Symbols();
Close All(Journals, No Save);
//***********************************************************************************************************************************************************
/*Open collected data from a share drive
and assign working data table(s) -->dt1
*/
dt1 = Open(
"C:\Users\...................filename.csv",
columns(
Column( "c000001", Character, "Nominal" ),
Column( "c000002", Character, "Nominal" ),
Column( "c000003", Character, "Nominal" ),
Column( "c000004", Character, "Nominal" ),
Column( "c000005", Character, "Nominal" ),
Column( "c000006", 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 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 0 ),
Column Names Start( 1 ),
Data Starts( 1 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
//The raw data table repeats information every 48 rows
//This table separates each item into individual tables
//The generated table does not have formated column headings
//For(i=1, i <=x, i++, //this For loop is ignored for now until dt2 --> dt problem is solved
selrows =dt1 <<SELECT rows=""></SELECT>
Su primer problema es que no hay filas en su tabla de datos dt3. si agregas
dt3 << add rows(N Rows( dt2 ));
justo después de crear dt3, podrá completar esa tabla.
El segundo problema es que lo que desea no es la segunda palabra de la cadena, sino todo lo que sigue al primer ":". Por lo tanto, usar la función Substr() funcionará mejor:
dt3[iii, 1] = Trim Whitespace( substr(Column( dt2, 1 )[iii], contains(column( dt2, 1 ), ":") ) )