Ho circa 95 file CSV con nomi di colonne diversi salvati nella cartella dati principale e 95 sottocartelle diverse come \data\dataset1\dataset1.csv, \data\dataset2\dataset2.csv, ecc. Le colonne id1 e id2 sono variabili comuni in tutti i files. Voglio fare quanto segue:
- Importa tutti i 95 file CSV in JMP (utilizzando JMP Pro 16)
- Aggiorna un valore in base a una condizione su tutti i 95 file: if (id1 = 'a001' then id2='b001')
- Salva i file CSV aggiornati con nomi diversi nelle rispettive cartelle
La prima riga è il titolo del file e non può essere rimossa. I nomi di colonna/variabile iniziano alla riga 2 e i dati alla riga 3.
Sono riuscito a importare tutti i file tramite:
dt: Importazione di più file(
< "C:\Dati\"
),
< < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < ) << Importa dati;
In questo codice non esiste una formula per stabilire dove iniziano i nomi delle colonne e i dati.
Quindi, ho provato ad aggiornare un valore utilizzando:
dt: soggetto <<
:id1 << Imposta formula(
Se( :id2 == "a001", :id1 == "b001")
);
Di conseguenza, i valori precedenti a "a001" nella colonna id1 vengono eliminati e il valore id1 di "a001" non viene aggiornato.
Sono in questa fase e non riesco nemmeno a pensare alla fase successiva di salvataggio dei file con nomi diversi nelle rispettive cartelle. Qualsiasi aiuto/guida è molto apprezzato.
Grazie
Grazie ancora. Questo e spettacolare.
Helal
Grazie, ho scritto un post perché sembra generalmente utile e in parte non è proprio ovvio come farlo.
CSV di aggiornamento IFM
Grazie Craige. Come hai detto, il secondo esempio ha funzionato bene. Tuttavia, funzionava solo se aprivo o importavo un CSV, ma non funzionava quando importavo più CSV. Inoltre, potresti guidarmi a completare anche l'ultima fase di riscrittura dei CSV nelle rispettive cartelle con nomi di file diversi?
Grazie,
Helal
Non sono sicuro di cosa abbia fatto il tuo JSL:
dt: subjid << :id1 << Set Formula( If( :id2 == "a001", :id1 == "b001") )
L'operatore << "invia" dovrebbe apparire solo una volta e la colonna a cui stai aggiungendo la formula dovrebbe essere quella a sinistra. Quindi nell'istruzione if dovrebbe esserci una condizione, seguita da un valore per il caso vero e un altro valore per il caso falso. Qualcosa come questo
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
)
)
);
che ha lo scopo di creare una nuova colonna formula di gatti o cani a seconda del valore nel nome della colonna. Se il nome è vuoto (mancante), "sconosciuto".
Oppure, se il tuo obiettivo è sovrascrivere una o più colonne esistenti in base ai valori di altre colonne, forse un ciclo esplicito sarebbe migliore di una colonna formula:
foreachrow(dt,
if(
name == "DANNY", // a test with ==
name = "Dani"; // an assignment with =
sex = "F";
, /* else if */ name == "ROBERT",
name = "Roberta";
sex = "F";
);
);
( Se segreti potrebbe aiutare a comprendere le virgole e i punti e virgola. ) Ciò lascia le righe invariate, a meno che il nome non corrisponda.
Nota come i due esempi sono diversi:
Il primo esempio deve produrre una risposta nel formato if(...) che verrà assegnata alla colonna della formula. Se la colonna deve rimanere invariata per quella riga, il valore della formula deve essere il valore originale della riga.Modifica: scusa, è sbagliato. Assicurati solo che la colonna della formula produca un valore per ogni riga.
Il secondo esempio aggiorna solo le righe e le colonne scelte.
Poiché prevedi di scrivere un file CSV (non di salvare un file JMP), l'espressione della formula che aggiungi a una colonna non verrà salvata (anche se i valori aggiornati dalla formula lo saranno). Penso che potresti volere qualcosa di più simile a secondo esempio.