Hallo,
Ich habe einen Ordner mit über 100 PDFs, die alle in einem einheitlichen Format angeordnet sind. Der Dateiname jeder PDF-Datei stellt eine Chargennummer dar, die ich verwenden möchte, und in jeder PDF-Datei befindet sich eine bestimmte Datentabelle, die ich extrahieren möchte.
Mein Ziel ist es, für jedes PDF dieselbe Datentabelle zu extrahieren und dann alle extrahierten Datentabellen zu verketten, die mit dem Namen der PDF-Datei (Chargennummer) gekennzeichnet sind. Schließlich möchte ich die Spalten in der verketteten Tabelle aufteilen und nach dem Namen der PDF-Datei gruppieren, um eine endgültige Tabelle zu erhalten.
Ich habe versucht, dies manuell zu tun und kann zum endgültigen Tisch gelangen, den ich benötige. Dies ist jedoch äußerst zeitaufwändig, da ich die Tabelle in jedem PDF separat öffnen und auswählen muss.
Daher frage ich mich, ob es eine JSL gibt, die dabei helfen kann.
Ich bin sehr neu in der Skripterstellung, konnte aber ein Skript erstellen, das mir genau das bietet, was ich für die ersten beiden PDF-Dateien benötige:
//Opening up the first two files (Batch Number 1 & Batch Number 2) from the folder
Open(
"C:\Example folder\Batch 1.pdf",
PDF Tables(
Table(
table name( "Batch 1" ),
add rows( page( 1 ), Rect( 0.4143, 5.3995, 7.5889, 6.6781 ) )
)
)
)
;
Open(
"C:\Example folder\Batch 2.pdf",
PDF Tables(
Table(
table name( "Batch 2" ),
add rows( page( 1 ), Rect( 0.4143, 5.3995, 7.5889, 6.6781 ) )
)
)
)
;
//Concatenating the data for the first 2 batches into one table and adding a source column:
Data Table( "Batch 1" ) << Concatenate(
Data Table( "Batch 2" ),
Create source column,
Output table("Concat")
)
;
//Splitting by the concatenated table by the Characteristic column and grouping by source column (batch number) to create a Final table:
Data Table( "Concat" ) << Split(
Split By( :Characteristic ),
Split( :Value ),
Group( :Source Table ),
Remaining Columns( Drop All ),
Sort by Column Property,
Output table("Final")
)
;
//Close all other tables
Close("Batch 1", no save)
;
Close("Batch 2", no save)
;
Close("Concat", no save)Ich muss dieses Skript anpassen, um alle PDF-Dateien (nicht nur die ersten beiden) zu öffnen und die endgültige Datentabelle zu erstellen, die mit dem Namen der PDF-Datei gekennzeichnet ist.
Gibt es jemanden, der mir helfen kann?
Vielen Dank,
Alicia
Wenn Sie zwei arbeiten, geben Sie den Code ein Datentabellen verketten wird dich wahrscheinlich dorthin bringen. FilesInDirectory () ist möglicherweise die Funktion, die Sie benötigen.
Es gibt eine Reihe ähnlicher Beispiele; Wenn Sie nach Dateien im Verzeichnis suchen, werden Sie diese wahrscheinlich finden.
Fragen Sie noch einmal, ob das Sie nicht dorthin bringt. Ich denke, Sie sind nah dran.
Hier ist ein Beispiel, das die Schritte enthält, die Sie benötigen. Die Post von @Craige_Hales hilft zu verstehen, wie diese Dinge funktionieren.
Names Default To Here( 1 );
// Prepare a directory
tempdir = "$TEMP\pdf_test";
If( !Directory Exists( tempdir ),
Create Directory( tempdir ),
file_lst = Files In Directory( tempdir );
For( i = 1, i <= N Items( file_lst ), i++,
Delete File( tempdir || "/" || file_lst[i] )
);
);
// Open sample Table
cdt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Prepare PDF's
For( i = 1, i <= 10, i++,
jrn = cdt << Journal;
jrn << save pdf( tempdir || "/" || Char( i ) || "_Big Class.pdf" );
jrn << close window;
);
// Read PDF's
file_lst = Files In Directory( tempdir );
table_lst = {};
For( i = 1, i <= N Items( file_lst ), i++,
Insert Into( table_lst, Open( tempdir || "/" || file_lst[i], PDF All Tables() ) )
);
// Concat PDF's
If( N Items( table_lst ) > 1,
result_table = table_lst[1] << concatenate( table_lst[2 :: N Items( table_lst )], Output Table( "ResultTable" ), Create Source Column )
);
// Close single PDF's
For( i = 1, i <= N Items( table_lst ), i++,
Close( table_lst[i], noSave )
);
split_table = result_table << Split(
Split By( :sex ),
Group( :Source Table ),
Split( :age ),
Remaining Columns( Drop All ),
Sort by Column Property, output table("Split_Result")
);Vielen Dank @Craige_Hales und @Georg für deine Hilfe. Ich werde versuchen, das Skript anzupassen. Sehr geschätzt!