Ho circa 95 file csv con nomi di colonne diversi salvati nella cartella principale dei dati e 95 diverse sottocartelle come \data\dataset1\dataset1.csv, \data\dataset2\dataset2.csv, ecc. Le colonne id1 e id2 sono variabili comuni tra tutti i files. Voglio fare quanto segue:
- Importa tutti i 95 file CSV in JMP (usando JMP Pro 16)
- Aggiorna un valore in base a una condizione in 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 delle colonne/variabili iniziano dalla riga 2 e i dati dalla 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 l'inizio dei nomi delle colonne e dei dati.
Quindi, ho provato ad aggiornare un valore utilizzando:
dt: subjid <<
:id1 << Imposta formula(
If( :id2 == "a001", :id1 == "b001")
);
risultato, i valori precedenti a "a001" nella colonna id1 vengono eliminati e il valore id1 di "a001" non viene aggiornato.
Sono a posto 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
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 il lato sinistro. 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 meglio 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 capire le virgole e il punto e virgola. ) Ciò lascia le righe invariate, a meno che il nome non corrisponda.
Notare come i due esempi siano diversi:
Il primo esempio deve produrre una risposta nel if(...) che verrà assegnato alla colonna della formula. Se la colonna deve essere invariata per quella riga, il valore della formula deve essere il valore originale per la 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 che sceglie.
Poiché prevedi di scrivere un file CSV (non salvare un file JMP), l'espressione della formula che aggiungi a una colonna non verrà salvata (sebbene lo saranno i valori aggiornati della formula). Penso che potresti volere qualcosa di più simile a secondo esempio.
Grazie Craig. Come hai detto, il secondo esempio ha funzionato bene. Tuttavia, ha funzionato solo se ho aperto o importato un CSV, ma non ha funzionato quando ho importato più CSV. Inoltre, mi guideresti per completare anche l'ultima fase della scrittura di csv nelle rispettive cartelle con nomi di file diversi?
Grazie,
Helal
Grazie, ho creato un post perché sembra generalmente utile e in parte non è proprio ovvio come fare.
Aggiornamento MFI CSV
Grazie ancora. Questo e spettacolare.
Helal