Normalerweise verwenden Sie beim Programmieren reguläre Ausdrücke, um in einem Verzeichnis nach Dateien zu suchen, die eine bestimmte Zeichenfolge enthalten, und verwenden dann einen Erfolgs- oder Fehlerausdruck.
In JMP scheint eine erweiterte Sortierung jedoch nicht allein mithilfe von „Dateien im Verzeichnis“ möglich zu sein.
Daher denke ich an einen Prozess, bei dem ich die Daten in einer Variable speichern, dann Bedingungen hinzufügen und sie auswerten kann. Welche Techniken würden Sie verwenden?
Wenn möglich, möchte ich die Dateien mithilfe mehrerer regulärer Ausdrücke sortieren.
Verwendetes JMP: JMP18.2.1
Filter Each() ist die richtige Methode. Beispiel zum Suchen von PNG-Dateien, die "2024-06" enthalten
Names Default To Here( 1 );
files = Files In Directory( Pick Directory( "" ) );
filtered_files = Filter Each( {v, i}, files, Contains( v, "2024-06" ) & Ends With( v, ".png" ) );
Mein Name ist Ono und ich bin leitender Tester in der JMP Japan-Abteilung des SAS Institute Japan.
Dies wurde bereits beantwortet, aber ich gebe der Sicherheit halber ein einfaches Beispiel.
Im Folgenden werden Regex und Filter Each verwendet, um Zeichenfolgen zu extrahieren, die mit „E“ (^E) beginnen, Zahlen halber Breite ([0-9]) enthalten und mit „.txt“ (\.txt$) enden.
files = {"E001.txt", "B002.txt", "EEEEE.txt", "E001.jpg", "E001.txt.jpg", "C001.txt", "EAB1.txt", "1111.txt"};
filtered_files = Filter Each( {v, i}, files, !Is Missing(Regex(v, "^E(.*)[0-9](.*)\.txt$" )));
Derselbe Vorgang kann mit Funktionen durchgeführt werden, die mit „Pat“ statt mit „Regex“ beginnen, die Spezifikation wird dann jedoch möglicherweise etwas länger.
files = {"E001.txt", "B002.txt", "EEEEE.txt", "E001.jpg", "E001.txt.jpg", "C001.txt", "EAB1.txt", "1111.txt"};
filtered_files = Filter Each( {v, i}, files,
Pat Match(v, Pat Pos(0) + "E" + Pat Arb() + Pat Regex("[0-9]") + Pat Arb() + ".txt" + Pat R Pos(0));
);
Der Rückgabewert von „Filter Each“ ist ebenfalls eine Liste, sodass Sie die Suche von dort aus weiter eingrenzen können.
Nachfolgend schränken wir die Ergebnisse weiter auf diejenigen ein, die die Zeichenfolge „001.txt“ im Dateinamen enthalten.
files = {"E001.txt", "B002.txt", "EEEEE.txt", "E001.jpg", "E001.txt.jpg", "C001.txt", "EAB1.txt", "1111.txt"};
filtered_files = Filter Each( {v, i}, files, !Is Missing(Regex(v, "^E(.*)[0-9](.*)\.txt$" )));
final_list = Filter Each({v,i}, filtered_files, Contains(v,"001.txt"));
Vielen Dank an alle für Ihre ausführlichen Antworten.
Obwohl die Manipulation von Variablen sehr wichtig ist, fiel es mir schwer, sie zu verstehen, und nach langem Ausprobieren landete ich beim folgenden Code.
1. Lesen Sie den Pfad eines beliebigen Ordners und erstellen Sie zuerst eine Liste der Dateien
2. Beschränken Sie sich auf CSV
3. Verwenden Sie reguläre Ausdrücke, um Dateien zu filtern, die kein bestimmtes Zeichen enthalten
Eines verstehe ich noch nicht: das "Is Missing!" davor. Wozu dient es?
//以下のフォルダにあるファイル一覧を変数に取得する。
files = Files In Directory( "%USERPROFILE%document" );
//絞り込み_CSVファイルである
filtered_files = Filter Each( {v, i}, files, !Is Missing(Regex(v, "^(.*)[0-9](.*)\.csv$" )));
//with_key_とspec_から始まるファイルを除外する;
list = Filter Each( {v, i}, filtered_files, !Is Missing(Regex(v, "^(?!.*with_key_|spec_).*$")));
show(list);
Ich bin froh, dass wir Ihren Wunsch erfüllen konnten.
Ein Ausrufezeichen „!“ allein ist der „Nicht-logische Operator“, der den darauf folgenden Ausdruck negiert. In JMP vertauscht der „Nicht-logische Operator“ die Werte 1 und 0. (Genauer gesagt gibt er in JMP 1 für 0 und 0 für jeden Wert ungleich Null zurück, einschließlich 1).
Dies wird in der folgenden Anleitung beschrieben.
(Sie können Ergebnisse finden, indem Sie in der Google-Suche nach „JMP Operators Help“ oder in der JMP-Hilfe nach „Operator Not“ suchen.)
Sie können auch im JMP-Pulldown-Menü unter „Hilfe“ > „Skriptindex“ nach „Nicht“ suchen, um Ergebnisse zu finden (wie unten beschrieben, hat der Operator „!“ eine Aliasfunktion namens „Nicht“).
Beispielsweise invertiert das Folgende eine 1 und gibt eine 0 zurück:
Als nächstes invertieren wir die 0 und setzen die 1 zurück.
Wenn der logische Operator „!“ schwer zu verstehen ist, gibt es eine äquivalente Funktion (eine Aliasfunktion) namens „Not-Funktion“.
Show(Not(1)); // 「!1」と同じ
Show(Not(0)); // 「!0」と同じ
Die Funktion „Is Missing“ gibt 1 zurück, wenn das Argument ein fehlender Wert ist, und 0, wenn das Argument ein nicht fehlender Wert ist. In diesem Beispiel möchten wir die invertierten Werte von 0 und 1, daher verwenden wir den logischen Operator „Nicht!“.
Im Folgenden ist das Argument ein fehlender Wert, sodass „Is Missing“ 0 zurückgibt, aber der logische Operator „Not“ „!“ kehrt dies in 1 um.
Im Folgenden gibt Is Missing 1 zurück, da das Argument ein nicht fehlender Wert ist, das „!“ ihn jedoch in 0 umkehrt.
Show(!Is Missing("Hello, World!"));
■Exkurs 1
Beachten Sie, dass sowohl die Funktion „Is Missing“ als auch der logische Operator „Not“ („!“) Matrizen und Listen als Argumente annehmen können, genau wie viele andere Funktionen und Operatoren.
x = [15.3, 12.1, ., 13.2, 14.1, .];
Show(!Is Missing(x));
y = {"りんご", "バナナ", "", "みかん"};
Show(!Is Missing(y));
■Exkurs 2
Falls !Is Missing(x) verwirrend ist, können Sie auch Is Missing(x)==0 oder Is Missing(x)!=1 schreiben. (Das Ausrufezeichen gefolgt von einem Gleichheitszeichen (!=) gibt 1 zurück, wenn die rechte Seite ungleich der linken Seite ist, und 0, wenn beide gleich sind.)
Show(Is Missing("")==0);
Show(Is Missing("")!=1);
Show(Is Missing("Hello, World!")==0);
Show(Is Missing("Hello, World!")!=1);
■Grund für die Verwendung von „!“ dieses Mal
Die Funktion „Filter Each“ extrahiert nur Elemente, für die der Auswertungswert des dritten Arguments wahr (1) ist.
Beispielsweise extrahiert das Folgende nur die Elemente einer Liste x, die größer als 2 sind:
x = {1,5,2,4,3,2,1,4,5,9,1};
y = Filter Each({v,i},x, v > 2);
Show(y);
Wenn Sie Elemente extrahieren möchten, bei denen v>2 das Gegenteil ist, geben Sie einfach v <= 2 an, Sie können aber auch !(v > 2) angeben.
x = {1,5,2,4,3,2,1,4,5,9,1};
y = Filter Each({v,i},x, !(v > 2));
Show(y);
!(v > 2) gibt „1“ zurück, wenn v nicht größer als 2 ist (d. h., v ist kleiner oder gleich 2), andernfalls „0“.
■Zusätzliche Hinweise
Ich bin mit regulären Ausdrücken nicht sehr vertraut, daher ist die Verarbeitung möglicherweise nicht unbedingt gleichwertig und der Code möglicherweise schwerer zu lesen. Ist es jedoch möglich, die regulären Ausdrücke wie unten gezeigt zu einem einzigen Ausdruck zu kombinieren? (Es tut mir leid, wenn ich mich bei der von Ihnen gewünschten Verarbeitung irre.)
files = {
"with_key_001.csv", "spec_001.csv",
"aaa_with_key_001.csv", "aaa_spec_001.csv",
"with_key_001bbb.csv", "spec_001bbb.csv",
"aaa_with_key_001bbb.csv", "aaa_spec_001bbb.csv",
"001.csv", "aaa001.csv", "001bbb.csv", "aaa001bbb.csv",<BR />"001.txt", "aaa001.txt", "001bbb.txt", "aaa001bbb.txt",<BR />"aaa001bbb.csv.txt"
};
list = Filter Each( {v, i}, files, !Is Missing(Regex(v, "^(?!.*with_key_|spec_)(.*)[0-9](.*)\.csv$" )));
show(list);