Extrahieren und verketten Sie CSV-Dateien aus Ordnern mit derselben Struktur<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hallo,
Ich habe zum Beispiel eine ganze Reihe von CSV-Dateien in verschiedenen Ordnern, die einen gemeinsamen Namen haben und die gleiche Struktur haben
<1. Ordner>dfgdwgssd
<2. Ordner mit allgemeinem Namen> allgemeiner Name
xxx-commonname.csv
Ich denke darüber nach, ein Skript zu verwenden, um alle CSV-Dateien zu extrahieren und zu verketten. Ich habe einen einfachen Weg mit Bash-Befehlen gefunden („for“-Schleife zusammen mit „find“). Könnte mir jemand helfen? Vielen Dank!
Betreff: CSV-Dateien aus Ordnern extrahieren und verketten, die dieselbe Struktur habenNochmals vielen Dank, Phil!
Ich verwende einen Mac und habe gerade bei Google gesucht und nur wenige Informationen zum Ausführen von Shell über JMP gefunden. Haben Sie einige Beispiele?
Betreff: CSV-Dateien aus Ordnern extrahieren und verketten, die dieselbe Struktur habenKlar, es ist mir ein Vergnügen! Ich wollte darauf hinweisen, dass Sie immer noch JMP verwenden können, um die gesamte Liste der Dateien abzurufen, und dann REGEX verwenden können, um nach den Dateinamen zu suchen, die enthalten. Tatsächlich kann ich mir vorstellen, dass es bei über 1300 Ordnern einige Zeit dauern könnte.
Ein paar Hinweise zur Geschwindigkeit:
- Das Drucken in das Protokoll verlangsamt die Arbeit.
- Außerdem würde ich zuerst alle Dateien öffnen, bevor ich sie verkettet und schließe.
*Wenn Sie einen Mac verwenden, können Sie ein Shell-Skript von JMP aus starten. Unter Windows ist Powershell eine gute Option zum Schreiben von Dienstprogrammprozeduren, die von JMP aus aufgerufen werden können, es sei denn, Sie verwenden Cygwin oder etwas Ähnliches.
Phil
Betreff: CSV-Dateien aus Ordnern extrahieren und verketten, die dieselbe Struktur habenHallo Phil,
Vielen Dank für eure Tipps! Ich habe Ihr Skript jedoch nicht ausgeführt.
Ich habe zum Ausprobieren eine kleine Anzahl von Ordnern verwendet und später festgestellt, dass es bei einer großen Anzahl von Ordnern (z. B. > 1.300) ewig dauert, da JMP in das zweite Verzeichnis wechselt und die *.csv-Datei usw. extrahiert. Das ist sehr, sehr zeitaufwändig. allerdings aufwändig.
Um die Effizienz zu verbessern, habe ich darüber nachgedacht, Bash zu verwenden, um alle CSV-Dateien in einen Ordner zu verschieben und sie dann zu verketten. Eine kurze Überprüfung, ob ich dafür Bash verwenden soll (CSV-Dateien extrahieren und verketten) mit >1.300 Ordnern, hat bei mir 3 Sekunden gedauert, bei einer verketteten CSV-Datei von 13 MB, also 3 Sekunden!!! Ich muss die Möglichkeit prüfen, den Bash-Befehl in JSL auszuführen.
Übrigens,
dt = Open( dirpath || TheFileList,invisible );
Die Datentabelle wird während der Verarbeitung nicht angezeigt
Danke nochmal!
Betreff: CSV-Dateien aus Ordnern extrahieren und verketten, die dieselbe Struktur habenHallo jjw ,
Zusätzlich zu Jims Vorschlag können Sie den folgenden allgemeinen Ansatz zur Auswahl der gewünschten Dateien ausprobieren. Siehe unten zum Beispiel:
allFiles = FilesInDirectory("$Documents", recursive);
selectedFiles = {};
commonName = "BrownP";
For( i = 1, i<=NItems(allFiles), i++,
If( !IsMissing( Regex(allFiles, EvalInsert(".*<COMMONNAME>.*\.csv","<",">" )) ),
InsertInto(selectedFiles, allFiles);
)
);</COMMONNAME>
1. Rufen Sie alle Dateinamen im Ordner „Eigene Dateien“ und seinen Unterordnern ab. (Ersetzen Sie es durch Ihren Ordnerpfad der obersten Ebene).
2. Erstellen Sie eine leere Liste, um die gewünschten Dateinamen zu speichern.
3. Definieren Sie die Zeichenfolge „commonName“.
4. Durchlaufen Sie alle Dateinamen, wählen Sie nur diejenigen aus, die dem Muster entsprechen, und speichern Sie sie im Ausgewählte Dateien Liste. In diesem Beispiel Ich rufe alle CSV-Dateien ab, deren Dateiname „BrownP“ enthält. (Durch Ihre eigene commonName-Zeichenfolge ersetzen).
Also die vollständige Implementierung (unter Verwendung von Jims Code aus dem vorherigen Beitrag):
Names Default To Here( 1 );
// Setup an empty table to start to concatenate other tables to
dtbase = New Table( "Base Table" );
// Have the user select the starting folder
dirpath = Pick Directory( "Pick the Top Level Directory" );
// Get all of the files in all of the folders that are under the picked folder
TheFileList = Files In Directory( dirpath, "recursive" );
// Define common string to search for
commonName = "file";
// Go through all of the files and read in append those that meet your
// requirement. You will need to amend the IF statement to meet your criteria
For( i = 1, i <= N Items( TheFileList ), i++,
If( !Is Missing( Regex( TheFileList, Eval Insert( ".*<COMMONNAME>.*\.csv", "<", ">" ) ) ),
dt = Open( dirpath || TheFileList );
dtbase = dtbase << concatenate( dt, append to first table( 1 ) );
Close( dt, nosave );
)
);</COMMONNAME>
Hoffe das hilft!
Am besten,
Phil
Betreff: CSV-Dateien aus Ordnern extrahieren und verketten, die dieselbe Struktur haben
Names Default To Here( 1 );
// Setup an empty table to start to concatenate other tables to
dtbase = New Table( "Base Table" );
// Have the user select the starting folder
dirpath = Pick Directory( "Pick the Top Level Directory" );
// Get all of the files in all of the folders that are under the picked folder
TheFileList = Files In Directory( dirpath, "recursive" );
// Go through all of the files and read in append those that meet your
// requirement. You will need to amend the IF statement to meet your criteria
For( i = 1, i <= N Items( TheFileList ), i++,
If( Uppercase( Word( -1, TheFileList[i], "." ) ) == "CSV" & Is File( dirpath || TheFileList[i] ) == 1,
If( Contains ( TheFileList[i], "<2nd folder common name"),
If( Contains (TheFileList[i],"<COMMON name="" of="" the="" csvfile="">"),
print(TheFileList[i]);
dt = Open( dirpath || TheFileList[i] );
dtbase = dtbase << concatenate( dt, append to first table( 1 ) );
Close( dt, nosave );
);
);
);
);</COMMON>
Fügen Sie zwei weitere Zeilen hinzu, damit es funktioniert. Die Ausrichtung/Einzug muss jedoch angepasst werden.
Danke schön!
Betreff: CSV-Dateien aus Ordnern extrahieren und verketten, die dieselbe Struktur habenJa, ich weiß, wie der „allgemeine Name“ sowohl für die 2. Ebene als auch für die CSV-Dateien lautet. Danke schön!
Betreff: CSV-Dateien aus Ordnern extrahieren und verketten, die dieselbe Struktur habenWissen Sie im Voraus, wie der „allgemeine Name“ lautet?Oder muss das Skript das herausfinden?Und wird in diesem Fall mehr als ein möglicher gebräuchlicher Name im Ordner gefunden?
Betreff: CSV-Dateien aus Ordnern extrahieren und verketten, die dieselbe Struktur habenHallo Jim,
Ich habe es zum Laufen gebracht, aber es wurden alle CSV-Dateien aufgelistet. Ich versuche, eine Möglichkeit zu finden, die 2. Ebene zu sortieren oder festzulegen. Könntest du bitte noch ein paar Tipps geben?
Danke schön!
Betreff: CSV-Dateien aus Ordnern extrahieren und verketten, die dieselbe Struktur habenHier ist ein Skript, das Ihnen einen guten Start ermöglichen sollte:
Names Default To Here( 1 );
// Setup an empty table to start to concatenate other tables to
dtbase = New Table( "Base Table" );
// Have the user select the starting folder
dirpath = Pick Directory( "Pick the Top Level Directory" );
// Get all of the files in all of the folders that are under the picked folder
TheFileList = Files In Directory( dirpath, "recursive" );
// Go through all of the files and read in append those that meet your
// requirement. You will need to amend the IF statement to meet your criteria
For( i = 1, i <= N Items( TheFileList ), i++,
If( Uppercase( Word( -1, TheFileList[i], "." ) ) == "CSV" & Is File( dirpath || TheFileList[i] ) == 1,
dt = Open( dirpath || TheFileList[i] );
dtbase = dtbase << concatenate( dt, append to first table( 1 ) );
Close( dt, nosave );
);
);