J'ai un script qui compile un groupe de fichiers journaux en fonction du titre des fichiers dans le répertoire source. Ce script lit un ID de lot à partir d'une table d'adresses et l'utilise pour rechercher le répertoire de chemin "dir" et compiler les fichiers cibles. Je dois réutiliser ce script pour qu'il examine le texte des fichiers disponibles afin de voir si l'ID de lot apparaît et compile en conséquence. J'ai vu quelques références à ce sujet en ligne, mais l'idée d'ouvrir chaque fichier pour faire la détermination semble être quelque chose qui pourrait prendre beaucoup de temps. Les idées sont appréciées.
Names Default To Here( 1 );
Clear Globals();
lst = Column( "lot" ) << Get Values;
n = N Items( lst );
dir = "\\Source_Directory\";
myfiles = {};
files = Files In Directory( dir, Recursive );
n_getfiles = N Items( files );
filteredFiles = {};
While( (testname = Remove From( files, 1 )) != {},
Relevant = Char( Regex( testname[1], "/4(\d{6})R", "4\1" ) );
If( Contains( testname[1], Relevant ),
Insert Into( filteredFiles, testname, 1 );
);
);
Show( filteredFiles );
t_filterfiles = t4 - t3;
n_filterfiles = N Items( filteredFiles );
Show( t_getfiles, n_getfiles, t_filterfiles, n_filterfiles );
Show( filteredFiles );
compiler_function = Function( {lot_number},
Try(
use1 = lot_number;
LotID = Char( use1 );
For( i = 1, i <= N Items( filteredFiles ), i++,
If( Contains( filteredFiles[i], LotID ),
Insert Into( myFiles, filteredFiles[i] ))
);
final_files = myfiles;
)
);
For( l = 1, l <= n, l++, //Show(l);
compiler_function( lst[l] )
);
i = 1;
dtjoin = Open(
dir || myfiles[i],
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, Comma, CSV( 1 ) ),
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" )
);
);
Wait( 0 );
Column( 1 ) << set name( "Column 1" );
dtjoin << set name( "Joined1" );
dtjoin << Add Rows( 1, after( N Rows( dtjoin ) ) );
For( i = N Rows( dtjoin ), i <= N Rows( dtjoin ), i++,
:Column 1[i] = "File 1"
);
i = 2;
For( i = 2, i <= N Items( myfiles ), i++,
dt = Open(
dir || myfiles[i],
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, Comma, CSV( 1 ) ),
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" )
);
);
Column( 1 ) << set name( "Column 1" );
dt << Add Rows( 1, after( N Rows( dt ) ) );
For( j = N Rows( dt ), j <= N Rows( dt ), j++,
:Column 1[j] = ("File " || Char( i ))
);
dtjoin = dtjoin << Concatenate(
dt, output table name( "Joined" || Char( i ) ),
);
Close( dt, nosave );
Close( "Joined" || Char( i - 1 ), nosave );
Wait( 0.1 );
);
dtjoin << set name( " Mask Data" );Quelle est la taille de vos fichiers ? Combien de fichiers ? L'ID peut-il être n'importe où dans le fichier ou à un emplacement/une ligne spécifique ? Qu'avez-vous essayé (par exemple Load Text File() ) ?
Les fichiers font environ 25 Ko, 300 à 400 lignes de long, le nombre de fichiers peut varier, peut-être 100 dans le pire des cas. Tout ce que j'ai envisagé aurait dû ouvrir chaque fichier pour décider de la pertinence, je n'ai rien écrit de tel, je pourrais expirer avant l'arrivée des données. Load Text File() semble intéressant, je vais bricoler avec ça.
L'importation de fichiers multiples peut s'avérer utile, soit en important et en empilant des fichiers CSV, soit en chargeant le texte non traité dans une ligne par fichier. Jouez avec l'interface graphique, puis enregistrez le script si vous obtenez quelque chose qui vous convient. Si vous pouvez utiliser des horodatages de fichiers, cela vous aidera également.