Tengo alrededor de 95 archivos csv con diferentes nombres de columnas guardados en la carpeta de datos principal y 95 subcarpetas diferentes como \data\dataset1\dataset1.csv, \data\dataset2\dataset2.csv, etc. Las columnas id1 e id2 son variables comunes todos los archivos. Quiero hacer lo siguiente:
- Importe los 95 archivos csv a JMP (usando JMP Pro 16)
- Actualice un valor basado en una condición en los 95 archivos: if (id1 = 'a001' then id2='b001')
- Guarde archivos csv actualizados con diferentes nombres en las carpetas respectivas
La primera fila es el título del archivo y no se puede eliminar. Los nombres de columnas/variables comienzan en la fila 2 y los datos en la fila 3.
Logré importar todos los archivos mediante:
dt: Importación de archivos múltiples (
< "C:\Datos\"
),
< < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < ) << Importar datos;
En este código, no existe una fórmula para determinar dónde comienzan los nombres de las columnas y los datos.
Luego, intenté actualizar un valor usando:
dt: subjid <<
:id1 << Establecer fórmula(
Si( :id2 == "a001", :id1 == "b001")
);
Como resultado, los valores anteriores a "a001" en la columna id1 se eliminan y el valor id1 de "a001" no se actualiza.
Estoy en esta fase y ni siquiera puedo pensar en la siguiente etapa de guardar archivos con diferentes nombres en sus respectivas carpetas. Cualquier ayuda/orientación es muy apreciada.
Gracias
Gracias de nuevo. Esto es asombroso.
Helal
Gracias, hice una publicación porque parece útil en general y algunas cosas no son realmente obvias sobre cómo hacerlo.
CSV de actualización de IMF
Gracias Craig. Como mencionaste, el segundo ejemplo funcionó bien. Sin embargo, solo funcionó si abro o importo un csv pero no funcionó cuando importé varios CSV. Además, ¿podría guiarme para realizar también la última etapa de escribir csv en sus respectivas carpetas con diferentes nombres de archivo?
Gracias,
Helal
No estoy seguro de lo que hizo su JSL:
dt: subjid << :id1 << Set Formula( If( :id2 == "a001", :id1 == "b001") )
El operador << "enviar" solo debe aparecer una vez y la columna a la que está agregando la fórmula debe estar en el lado izquierdo. Luego, en la declaración if, debería haber una condición, seguida de un valor para el caso verdadero y otro valor para el caso falso. Algo como esto
dt << New Column( "likes",
"character",
formula( If(
Is Missing( name ), // first test
"unknown", // if first test is true
name == "KATIE", // second test
"cats", // if second test is true
"dogs" // if second test is false
)
)
);
que tiene como objetivo crear una nueva columna de fórmula de gatos o perros dependiendo del valor en el nombre de la columna. Si el nombre está en blanco (falta), "desconocido".
O, si su objetivo es sobrescribir una columna existente en función de los valores de otras columnas, tal vez un bucle explícito sería mejor que una columna de fórmula:
foreachrow(dt,
if(
name == "DANNY", // a test with ==
name = "Dani"; // an assignment with =
sex = "F";
, /* else if */ name == "ROBERT",
name = "Roberta";
sex = "F";
);
);
( Si secretos podría ayudar a comprender las comas y el punto y coma. ) Eso deja las filas sin cambios, a menos que el nombre coincida.
Observe cómo los dos ejemplos son diferentes:
El primer ejemplo debe producir una respuesta en if(...) que se asignará a la columna de la fórmula. Si la columna no debe modificarse para esa fila, el valor de la fórmula debe ser el valor original de la fila.Editar: lo siento, eso está mal. Solo asegúrese de que la columna de fórmula produzca un valor para cada fila.
El segundo ejemplo solo actualiza las filas y columnas que elige.
Dado que planea escribir un archivo CSV (no guardar un archivo JMP), la expresión de fórmula que agregue a una columna no se guardará (aunque sí se guardarán los valores actualizados de la fórmula). Creo que es posible que desee algo más parecido a segundo ejemplo.