Ich habe ein Skript, das eine Gruppe von Protokolldateien kompiliert, abhängig vom Titel der Dateien im Quellverzeichnis. Dieses Skript liest eine Lot-ID aus einer Adresstabelle ein und verwendet diese, um das Pfadverzeichnis „dir“ zu durchsuchen und die Zieldateien zu kompilieren. Ich muss dieses Skript umfunktionieren, sodass es im Text der verfügbaren Dateien nachsehen soll, ob die Lot-ID dort auftaucht, und entsprechend kompiliert. Ich habe online einige Hinweise dazu gesehen, aber die Idee, jede Datei zu öffnen, um dies festzustellen, scheint etwas zu sein, das sehr lange dauern könnte. Ideen sind willkommen.
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" );Wie groß sind Ihre Dateien? Wie viele Dateien? Kann die ID irgendwo in der Datei oder an einer bestimmten Stelle/Zeile stehen? Was haben Sie versucht (z. B. Load Text File() )?
Die Dateien sind ca. 25 kB groß und 300–400 Zeilen lang. Die Anzahl der Dateien kann variieren, im schlimmsten Fall vielleicht 100. Alles, was ich in Betracht gezogen habe, hätte jede Datei öffnen müssen, um die Relevanz zu bestimmen. Ich habe nichts dergleichen geschrieben, ich könnte sterben, bevor die Daten ankommen. „Load Text File()“ sieht interessant aus, daran werde ich herumbasteln.
Der Import mehrerer Dateien kann hilfreich sein, entweder durch Importieren und Stapeln von CSV oder durch Laden des unverarbeiteten Textes in eine Zeile pro Datei. Probieren Sie die GUI aus und speichern Sie das Skript, wenn Sie etwas erhalten, das Ihnen gefällt. Wenn Sie Dateizeitstempel verwenden können, ist das auch hilfreich.