Bonjour à tous,
J'ai un dossier contenant plus de 100 fichiers PDF, tous présentés dans un format cohérent. Le nom de fichier de chaque PDF représente un numéro de lot que je veux utiliser et dans chaque PDF il y a un tableau particulier de données que je veux extraire.
Mon objectif est d'extraire la même table de données pour chaque PDF, puis de concaténer toutes les tables de données extraites, étiquetées par le nom du fichier PDF (numéro de lot). Enfin, je souhaite diviser les colonnes du tableau concaténé et le regrouper par nom de fichier PDF pour obtenir un tableau final.
J'ai essayé de le faire manuellement et je peux accéder au tableau final dont j'ai besoin, mais cela prend énormément de temps car je dois ouvrir et sélectionner le tableau dans chaque PDF séparément.
Par conséquent, je me demande s'il y a un certain JSL qui pourra aider avec ceci ?
Je suis très nouveau dans les scripts, mais j'ai pu créer un script qui me donne exactement ce dont j'ai besoin pour les deux premiers fichiers PDF :
//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)Je dois adapter ce script pour ouvrir tous les fichiers PDF (pas seulement les deux premiers) pour créer le tableau final de données, étiqueté par le nom du fichier PDF.
Est-ce qu'il y a quelqu'un qui peut m'aider?
Merci beaucoup,
Alicia
Un grand merci @Craige_Hales et @Georg Pour votre aide. Je vais essayer de voir si je peux adapter le script. Vraiment apprécié!
Voici un exemple qui contient les étapes dont vous aurez besoin. Le poste de @Craige_Hales aide à comprendre comment ces choses fonctionnent.
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")
);Si vous en avez deux qui fonctionnent, le code dans Concaténer des tables de données vous y mènera probablement. FilesInDirectory() peut être la fonction dont vous avez besoin.
Il existe un certain nombre d'exemples similaires; la recherche de fichiers dans le répertoire les trouvera probablement.
Demandez à nouveau si cela ne vous y amène pas, je pense que vous êtes proche.