Ri: Importa più file CSV, ma alcuni errori nel formato del titolo devono essere modificati da JSLSe fosse possibile fornire un esempio (o pochi se esistono diversi tipi di) file .csv, ciò sarebbe più semplice. In caso contrario, potresti fornire una tabella dati "rotta"?
Ri: Importa più file CSV, ma alcuni errori nel formato del titolo devono essere modificati da JSLHo allegato la tabella di esempio come riferimento
Importa più file CSV, ma alcuni errori nel formato del titolo devono essere modificati da JSLSto cercando di importare più file CSV, la funzione "importa più file" non funziona bene perché il formato del nome della colonna di dati originale presenta due problemi che causano la mancata corrispondenza del titolo e dei dati
1. Il nome della colonna dati è simile a questo: Data ora nome ( ABC ) (DEF ) altezza peso ...... ecc
2. I dilim di cui ho bisogno sono spazio e (e)
3. Tuttavia, c'è spazio o scheda aggiuntivo prima di "Data", quindi il nome della prima colonna diventa Colonna 1 anziché Data e il titolo viene spostato a destra di una colonna rispetto ai dati
4. il secondo errore è (D, non c'è spazio tra questi due per il titolo, quindi vengono trattati come un titolo, ma i dati sono separati in ( e D due colonne perché c'è spazio in mezzo, quindi il titolo verrà spostato a sinistra una colonna confronta con i dati
5. Il primo errore esiste sempre prima del nome della prima colonna "Data", ma il secondo errore "(D" potrebbe apparire in un ordine diverso in base allo strumento di origine
Vorrei scrivere un JSL in modo che possa corrispondere automaticamente a tutti i titoli e alle colonne, ma non sono sicuro di come farlo:
Immagino che il primo passaggio sia utilizzare Ottieni nomi colonne() quindi analizzare i nomi, ma parse() e word() sembrano non funzionare.
Sono bloccato qui, davvero inesperto nella programmazione, grazie per il tuo aiuto in anticipo

Automazione e scriptingRi: Importa più file CSV, ma alcuni errori nel formato del titolo devono essere modificati da JSLBasandomi sull'esempio a due righe, molto probabilmente andrei a pulire il file .csv (rimuovi () e comprimi gli spazi bianchi) e quindi utilizzerei Apri con Char to Blob() per convertire quella stringa "fissa" in una tabella dati
Names Default To Here(1);
str = Load Text File("$DOWNLOADS/sample CSV.csv");
lines = Words(str, "\!N");
data = Transform Each({line}, lines,
str = Collapse Whitespace(Substitute(line, {"(", ")"}, ""))
);
str = Concat Items(data, "\!N");
dt = Open(Char To Blob(str),
Import Settings(
End Of Line(CRLF, CR, LF),
End Of Field(Spaces, Space, 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),
First Named Column(1),
Data Starts(2),
Lines To Read("All"),
Year Rule("20xx")
)
);Ri: Importa più file CSV, ma alcuni errori nel formato del titolo devono essere modificati da JSL@jthi
La tua soluzione è fantastica!
Una domanda.La tua riga in cui rimuovi le parentesi da ciascuna riga, specifichi
str = Collapse Whitespace(Substitute(line, {"(", ")"}, ""))
dove sostituisci tutto "(" con ")" e poi sostituisci tutto ")" con "".
Il mio approccio vecchia scuola sarebbe:
str = Collapse Whitespace(Substitute(line, "(", "", ")", ""))
dove le "(" vengono sostituite con "" e poi le ")" vengono sostituite con "".
C'è un vantaggio nella tua sintassi o è solo una scelta personale?
Ri: Importa più file CSV, ma alcuni errori nel formato del titolo devono essere modificati da JSLÈ solo una mia scelta personale. Generalmente quando voglio sostituire più cose con la stessa cosa, fornisco a Sostituisci un elenco dei valori da sostituire e quindi il valore una volta. Se voglio sostituirli con cose diverse utilizzo l'approccio che hai mostrato OPPURE se devo crearlo dinamicamente/avere un file di configurazione userò due elenchi
Names Default To Here(1);
str = "AA BB CC DD";
a = Substitute(str, {"AA", "BB"}, "11"); // a = "11 11 CC DD";
b = Substitute(str, "AA", "11", "BB", "22"); // b = "11 22 CC DD";
subs = ["AA" => "33", "BB" => "44"];
c = Substitute(str, subs << get keys, subs << Get Values); // c = "33 44 CC DD";
show(a, b, c);Ri: Importa più file CSV, ma alcuni errori nel formato del titolo devono essere modificati da JSLGrazie per il vostro supporto, questo metodo funziona bene per un singolo file
Ma mi resta ancora una domanda: ho molti file con lo stesso formato che devono essere importati come un unico file JMP.
Quindi sembra che questo metodo richieda di aprirli uno per uno e quindi di concatenarli in un unico file
Questo è il motivo per cui il mio pensiero originale era:
1. utilizzare la funzione di importazione multipla
2. ottieni i nomi delle colonne
3. quindi utilizzare la funzione ricodifica nome colonna per modificare il nome di ciascun colonna
Ri: Importa più file CSV, ma alcuni errori nel formato del titolo devono essere modificati da JSLC'è qualche motivo specifico per cui non puoi fare quanto segue
- Ottieni l'elenco dei file che ti interessano
- Utilizzare For Each per eseguirne il ciclo
- All'interno del ciclo analizza i file e concatenali in una tabella che apri per prima
Potresti provare a correggere anche le colonne, ma in base al tuo esempio è stato molto più semplice correggere semplicemente il file CSV piuttosto che iniziare a fare confusione con i nomi delle colonne e/o spostare i valori dopo aver importato i valori
Ri: Importa più file CSV, ma alcuni errori nel formato del titolo devono essere modificati da JSLAnche riparare il programma che genera il file potrebbe essere una buona opzione. Questo non è un CSV standard e non credo che nessun altro programma lo analizzerà correttamente.
Ri: Importa più file CSV, ma alcuni errori nel formato del titolo devono essere modificati da JSLConcatenare tabelle di dati mostra un modo per farlo
Ri: Importa più file CSV, ma alcuni errori nel formato del titolo devono essere modificati da JSLHo provato a utilizzare il ciclo for per eseguire il loop sui file, ma non funziona, sembra che qualcosa vada storto quando ho provato a concatenarli
Names Default To Here(1);
dir = Pick Directory("Select a directory");
filelist = Files In Directory(dir);
strings = {};
For(i = 1, i <= N Items(filelist), i++,
file = dir || Eval(Parse(filelist[i]));
str = Load Text File(file);
lines = Words(str, "\!N");
data = Transform Each({line}, lines,
str = Collapse Whitespace(Substitute(line, {"(", ")"}, ""))
);
str = Concat Items(data, "\!N");
strings = strings || str;
);
dt = Open(
Char To Blob(str),
Import Settings(
End Of Line(CRLF, CR, LF),
End Of Field(Spaces, Space, 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(2),
First Named Column(1),
Data Starts(3),
Lines To Read("All"),
Year Rule("20xx")
)
);
Ri: Importa più file CSV, ma alcuni errori nel formato del titolo devono essere modificati da JSLDopo diverse prove, il codice seguente importa con successo più CSV tramite il ciclo e il formato è corretto.
Ma mi restano ancora due problemi:
1. a partire dal secondo file, le intestazioni non vengono escluse come titolo della colonna, vengono trattate come dati nella tabella, ci sono due righe di intestazioni, la prima riga è il nome del file, la seconda riga sono titoli separati da spazio
2. Vorrei aggiungere la colonna del nome file in modo da poter analizzare file diversi, ma non è come importare più file con la funzione di importazione di più file che posso ottenere facilmente?
Nomi predefiniti qui (1);
dir = Scegli directory("Seleziona una directory");
filelist = File nella directory (dir);
mialista = {};
For( i = 1, i <= N elementi( filelist ), i++,
file = dir || "/" || elencofile[i];
str = Carica file di testo (file);
righe = Parole(str, "\!N");
dati = Trasforma Ciascuno({riga}, righe,
riga = Comprimi spazio bianco(Sostituisci(riga, {"(", ")"}, ""))
);
modificatostr = Concatena elementi(data, "\!N");
mialista[i] = modificatostr;
);
dt = Apri(
Char To Blob( Concat Items( mylist, "\!N") ),
Importa impostazioni(
Fine riga (CRLF, CR, LF),
Fine del campo (spazi, spazio, CSV (0)),
Citazioni di striscia( 1 ),
Usa l'apostrofo come virgoletta (0),
Utilizza impostazioni regionali( 0 ),
Tratta le colonne vuote come numeriche (0),
Comprimi colonne numeriche (0),
Comprimi colonne di caratteri (0),
Comprimi controllo elenco consentiti (0),
Etichette( 1 ),
Nomi delle colonne Inizio( 2 ),
Prima colonna con nome( 1 ),
Inizio dati( 3 ),
Righe da leggere( "Tutto" ),
Regola dell'anno("20xx")
)
);
Ri: Importa più file CSV, ma alcuni errori nel formato del titolo devono essere modificati da JSLNon creare una stringa enorme, ma piuttosto crea tabelle di dati una per una e concatenale man mano che procedi. Inoltre, quando pubblichi script JSL, utilizza "Inserisci script JSL"
in quanto rende molto più facile la lettura.
</CODE></PRE>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><span class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><img src="https://us.v-cdn.net/6038925/uploads/images/60013iEF81464ED8426C0C/jthi_2-1703167262034.png" role="button" title="jthi_2-1703167262034.png" alt="jthi_2-1703167262034.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P>
<P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-711549" slang="en-US" mode="NONE">Ri: Importa più file CSV, ma alcuni errori nel formato del titolo devono essere modificati da JSL</LINGO-SUB><LINGO-BODY id="lingo-body-711549" slang="en-US" mode="NONE"><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/14366" target="_blank">@jthi</A> è giusto, ma se vuoi continuare a concatenare le stringhe, avrai bisogno di alcune modifiche.<STRONG>L'operazione fallirà se la concatenazione supera i 2 GB di caratteri perché è la stringa più lunga che JMP può gestire.</STRONG></P>
<P>idea:</P>
<PRE><CODE class=" language-jsl">
For( i = 1, i <= N Items( filelist ), i++,
file = dir || "/" || filelist[i];
str = Load Text File( file );
lines = Words(str, "\!N");
header1 = RemoveFrom(lines, 1); // remove the first line, two times.
header2 = RemoveFrom(lines, 1); // (removes both header lines.)
data = Transform Each({line}, lines,
// prepend the file name to each data line
filelist[i] || " " || Collapse Whitespace(Substitute(line, {"(", ")"}, ""));
);
modifiedstr = Concat Items(data, "\!N");
mylist[i] = modifiedstr;
);
header2 = "filename" || header2; // add the column name "filename"
insertInto(mylist,header2,1); // check the order of the arguments, the goal
insertInto(mylist,header1,1); // is to push these onto the front of the list
// now do the import...Names Default To Here(1);
dir = "$DOWNLOADS/New Folder (7)";
filelist = Files In Directory(dir);
mylist = {};
dt_collector = Empty();
For(i = 1, i <= N Items(filelist), i++,
file = dir || "/" || filelist[i];
str = Load Text File(file);
lines = Words(str, "\!N");
data = Transform Each({line}, lines,
line = Collapse Whitespace(Substitute(line, {"(", ")"}, ""))
);
modifiedstr = Concat Items(data, "\!N");
dt = Open(
Char To Blob(modifiedstr),
Import Settings(
End Of Line(CRLF, CR, LF),
End Of Field(Spaces, Space, CSV(0)),
Strip Quotes(1),
Use Apostrophe as Quotation Mark(0),
Use Regional Settings(0),
Treat empty columns as numeric(0),
Compress Numeric Columns(0),
Compress Character Columns(0),
Compress Allow List Check(0),
Labels(1),
Column Names Start(1),
First Named Column(1),
Data Starts(2),
Lines To Read("All"),
Year Rule("20xx")
),
invisible
);
dt << Set Name(filelist[i]);
dt << New Column("Source", Character, Nominal, << Set Each Value((dt << get name)));
If(!Is Empty(dt_collector),
dt_collector << Concatenate(
dt,
Append to first table
);
Close(dt, no save);
,
dt_collector = dt;
);
);
non testato, ma giusto. cercare InsertInto() e RemoveFrom(); Al momento non ho JMP aperto. L'idea è di rimuovere (e catturare) le prime due righe, ogni volta, e dopo che tutto è stato catturato e impilato, mettere le prime due righe in primo piano, con il nome della colonna extra appiccicato. E all'interno, aggiungi il nome del file per ogni riga.
Ri: Importa più file CSV, ma alcuni errori nel formato del titolo devono essere modificati da JSLGrazie per il tuo supporto, ho davvero imparato molto in questo progetto jsl.