Anfängerfrage zur Datentabellengenerierung (Extraktion) aus RohsondendatenHallo zusammen, dies ist mein erster Beitrag in dieser Community. Ich habe kürzlich den Job gewechselt und werde viele Prober-Benchtests und Datenanalysen durchführen. Ich habe JMP ein wenig verwendet, aber überhaupt nichts Fortgeschrittenes.
Momentan generieren meine Tests immer eine große CSV-Datei und die Messdaten sind zusammen mit uninteressanten Informationen (wie etwa Testaufbau, Bedingungen usw.) vergraben. Ich hätte gern etwas Hilfe dabei, die nützlichen Informationen mithilfe eines JMP-Skripts herauszuziehen und von hier aus mit meinem fortgeschrittenen Skript-Lernen zu beginnen.
Meine Aufgabe erkläre ich im beigefügten Screenshot. Oben rechts ist ein Beispiel für einen einzelnen IV-Sweep-Datenpunkt (zur Messung von R), um Ihnen eine Vorstellung davon zu geben, wie mein riesiges CVS aussieht (es enthält Hunderte solcher Strukturen). „Mehrzeilige, uninteressierte Informationen“ stellt die nutzlosen Zeilen dar, die ich nicht importieren möchte. Neben dem Kopieren und Einfügen des I/V/R-Datenteils extrahiere ich auch gerne die Wafer-Los-ID, die Wafer-ID, den Retikel-Index (oder sagen wir Stepper-Feld) und die Unterstandortnummer aus einigen Zeichenfolgen. Das Feld oben rechts zeigt meine gewünschte JMP-Ausgabe.
Als optionale Lektüre gibt es in den unteren beiden Kästen einige Trivia. Unten links sind meine allgemeinen Kommentare zur Datenstruktur und unten rechts werden die Bedeutungen der Zeichenfolgen erklärt, aus denen ich bestimmte Informationen extrahieren muss.
Ich hoffe, der Screenshot liefert Ihnen genügend Informationen für meine Frage. Früher habe ich solche Arbeiten mit dem Excel-VBA-Makro durchgeführt: Suchsignaturzeichenfolgen scannen, dann selektiv bestimmte Zeichen/Zeichenfolgen/Zeilen in der Nähe dieser Position importieren und dann die Suche bis zum Ende der Rohdatendatei fortsetzen. Ich frage mich, ob das JMP-Skript dasselbe tun würde?
Automatisierung und SkripterstellungBetreff: Anfängerfrage zur Datentabellenerstellung (Extraktion) aus RohsondendatenKein Screenshot. Wäre es möglich, einen kleinen, anonymisierten Datensatz oder eine CSV-Datei anzuhängen?
Betreff: Anfängerfrage zur Datentabellenerstellung (Extraktion) aus RohsondendatenHallo pmroz, danke für die schnelle Antwort. Ich habe den Anhang beim ersten Absenden vergessen, aber dann habe ich innerhalb einer Minute den Beitrag bearbeitet und den Screenshot angehängt. Du kannst es noch einmal überprüfen.
Außerdem lade ich die Excel-Datei gemäß Ihrer Anfrage hier hoch. Ich habe die meisten nutzlosen Informationen gelöscht, um die Datei zu bereinigen, aber Sie können das obere linke Feld als Beispiel für „Rohdaten“ kopieren und einfügen.
Betreff: Anfängerfrage zur Datentabellenerstellung (Extraktion) aus RohsondendatenDas von Ihnen angezeigte Format sollte beim Einlesen kein großes Problem darstellen. Die uninteressanten Informationszeilen machen mir Sorgen, da das, was dort steht, das Einlesen der Daten beeinträchtigen kann. Meine andere Sorge ist, wie ich JMP dazu bringen kann, die Zeile zu erkennen, die den Projektnamen enthält. Beginnt sie immer mit Proj?
Die Bereitstellung einer tatsächlichen Datei wäre sehr hilfreich.
Betreff: Anfängerfrage zur Datentabellenerstellung (Extraktion) aus RohsondendatenWie andere bereits gesagt haben, kann dies stark von Ihrem tatsächlichen Datenformat abhängen. Unten finden Sie ein Beispiel mit den aus Excel in eine Textdatei kopierten und eingefügten Daten
Names Default To Here(1);
filepath = "$DOWNLOADS/744027.txt";
txt = Load Text File(filepath);
lines = Words(txt, "\!N");
project_pattern = "^(.+)_(\d+\.\d*)(W\d{1,2})_(T\d+)_(.+):(.+)?";
subsite_pattern = "<SUBSITE>(\d+)</SUBSITE>";
datastart_pattern = "^DataName";
data_start = 0;
For Each({line, idx}, lines,
If(!IsMissing(Regex(line, project_pattern)),
matches = Regex Match(line, project_pattern);
projname = matches[2];
lotid = matches[3];
waferid = matches[4];
time = matches[5];
notes = matches[6];
reticles = Words(Trim Whitespace(matches[7]), " ");
, !IsMissing(Regex(line, subsite_pattern)),
subsite = Regex(line, subsite_pattern, "\1");
, !IsMissing(Regex(line, datastart_pattern)),
data_start = idx;
break();
);
);
data_str = Concat Items(lines[data_start::N Items(lines)], "\!N");
dt = Open(Char To Blob(data_str), "text");
dt << New Column("lot", Character, Nominal, Set Each Value(lotid));
dt << New Column("waferid", Character, Nominal, Set Each Value(waferid));
dt << New Column("x", Character, Nominal, Set Each Value(reticles[1]));
dt << New Column("y", Character, Nominal, Set Each Value(reticles[2]));
dt << New Column("subsite", Character, Nominal, Set Each Value(subsite));
dt << Move Selected Columns({:lot, :waferid, :x, :y, :subsite}, To First);
dt << Delete Columns("DataName");
Es verwendet reguläre Ausdrücke, um bestimmte Zeilen zu finden und analysiert sie dann. Bei Daten findet es den Zeilenindex, an dem sie beginnen, und analysiert sie dann, indem es sie einfach von JMP öffnen lässt (je nach den tatsächlichen Daten sind hierfür möglicherweise zusätzliche Schritte erforderlich).

Betreff: Anfängerfrage zur Datentabellenerstellung (Extraktion) aus Rohsondendaten- Ich habe die Subsite übersehen, tut mir leid. Ich habe sie dem Skript hinzugefügt.
- Der Zweck des Diskussionsforums besteht darin, JMP-Benutzern bei Problemen mit der Ausführung von JMP zu helfen. Es handelt sich nicht um einen kostenlosen Skript-Schreibservice. Der Grund, warum ich Skripte für Community-Mitglieder schreibe, ist, ihnen den Umgang mit JSL beizubringen. Ich hoffe, dass sich die Empfänger der von mir bereitgestellten Skripte die Zeit nehmen, daraus zu lernen, damit sie ihr gesamtes Problem lösen können.
- Ich habe die dynamischen Spalten (Teilspalteneigenschaften) so geändert, dass sie numerisch sind
- Das Skript hängt nun jede erstellte Tabelle zusammen
- Was die Komprimierung des Codes betrifft... warum? Wenn der Zweck der Komprimierung darin besteht, dass der Code schneller läuft, könnte ich damit einverstanden sein. Aber wenn die Komprimierung eines Codestücks es für den nächsten Menschen, der es lesen muss, schwieriger macht, es zu lesen, dann ist der Code kein guter Code. Daher lautet meine Antwort auf Ihre Frage, ob der Code in ein prägnanteres Format komprimiert werden könnte, dass ich sicher bin, dass das möglich ist.
names default to here(1);
clear symbols( dtOut );
file = pick file();
dt = Open(
File,
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Comma, CSV( 0 ) ),
Treat Leading Zeros as Character( 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( 0 ),
Column Names Start( 1 ),
First Named Column( 1 ),
Data Starts( 1 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
// Change column names to simplify coding
for( i=1,i<=ncols(dt), i++, column(i)<< set name( "C" || char(i)));
// Create a base output table
dtFinal = New Table( "Final" );
// Loop through the data
for(theRow = 1, theRow <= NRows(dt), theRow++,
If( dt:C1[theRow] == "SetupTitle",
memoryProjectName = "";
memoryLotName = "";
memoryWaferID = "";
memoryT0 = "";
memory1strun = "";
memoryIndexX = .;
memoryIndexY = .;
memorySubsite = .;
setupFlag = 1;
projFlag = 0;
// If this is not the first read in table, then append the table
// to the Final table, and close the current dtOut table
If( nrows(dtFinal) != 0 | isEmpty( dtOut ) == 0,
dtFinal << concatenate( dtOut, append to first table(1));
close( dtOut, nosave )
)
,
dt:C1[theRow] == "" & setupFlag == 1,
projFlag = 1;
setupFlag = 0;
,
projFlag == 1 & dt:C1[theRow] != "",
dt:C1[theRow] = trim(dt:C1[theRow]);
memoryProjectName = word(1, dt:C1[theRow], "_");
memoryLotName = word(2, dt:C1[theRow], "_W");
memoryWaferID = word(3, dt:C1[theRow], "_W");
memoryT0 = word(4, dt:C1[theRow], "_W");
memory1strun = word(5, dt:C1[theRow], "_W:");
memoryIndexX = num(word(2, dt:C1[theRow], ": "));
memoryIndexY = num(word(3, dt:C1[theRow], ": "));
memorySubsite = num(word(2, trim(dt:C1[theRow + 2 ]),"<>"));
projFlag = 0;
,
dt:C1[theRow] == "DataName",
colList = {};
col=2;
while( column(dt,col)[theRow] != "",
insert into(colList, column(dt,col)[theRow]);
col++
);
dtOut = New Table( "Lot " || memoryLotName || " WaferID " || memoryWaferID,
new column( "Project Name", character),
new column( "Lot Name", character),
new column( "WaferID", character),
new column( "Time Readout", character),
new column( "Personal Note", character),
new column( "SubSite", numeric, ordinal),
new column( "Index X", numeric, ordinal),
new column( "Index Y", numeric, ordinal)
);
for each( {colName}, colList,
dtOut << new column( eval(colName), numeric, continuous);
);
,
dt:C1[theRow] == "DataValue",
dtOut << Add Rows(1);
dtOut:Project Name[nrows(dtOut)] = memoryProjectName;
dtOut:Lot Name[nrows(dtOut)] = memoryLotName;
dtOut:WaferID[nrows(dtOut)] = memoryWaferID;
dtOut:Time Readout[nrows(dtOut)] = memoryT0;
dtOut:Personal Note[nrows(dtOut)] = memory1strun;
dtOut:SubSite[nrows(dtOut)] = memorysubsite;
dtOut:Index X[nrows(dtOut)] = memoryIndexX;
dtOut:Index Y[nrows(dtOut)] = memoryIndexY;
for each( {colName, index}, colList,
column( dtOut, colName )[nrows(dtOut)] = num(column(dt,index+1)[theRow])
)
)
);
// Close the last work file
close( dtOut, nosave );
// Uncomment the below line if you want the raw table deleted
// close( dt, nosave );
Betreff: Anfängerfrage zur Datentabellenerstellung (Extraktion) aus RohsondendatenIch führe meine frühere Idee fort, indem ich die Textdatei in Abschnitte aufteile und diese Abschnitte dann analysiere (diese Aufzeichnung behandelt dieses Thema teilweise: Scripters Club 2024: Sitzung 2 – Vorbereiten unstrukturierter eingehender Daten für die Analyse ).
Names Default To Here(1);
// Test sections seem to always start with a line starting with "SetupTitle"
// and end to same UNLESS it is last section when it ends with
// line of ",,,,,,,,,,,,,,,,,,,,,,,"
TEST_SECTION_START = "SetupTitle, ";
EMPTY_LINE = ",,,,,,,,,,,,,,,,,,,,,,,";
// Section patterns for regex
PROJECT_PATTERN = "^(.+)_(\d+\.\d*)(W\d{1,2})_(T\d+)_(.+): (\d+ \d+)\,+?";
SUBSITE_PATTERN = "<SUBSITE>(\d+)</SUBSITE>";
DATASTART_PATTERN = "^DataName";
find_test_section_lines = function({lines}, {Default Local},
start_idx = 0;
end_idx = 0;
TEST_SECTION_START = TEST_SECTION_START; // JMP "feature", 00075244
TEST_SECTION_END = TEST_SECTION_END; // JMP "feature", 00075244
For Each({line, idx}, lines,
If(Starts With(line, TEST_SECTION_START),
If(start_idx == 0,
start_idx = idx;
,
end_idx = idx;
break();
);
);
);
If(start_idx != 0 & end_idx == 0,
end_idx = N Items(lines);
);
return(Eval List({start_idx, end_idx}));
);
parse_test_section = function({lines}, {Default Local},
data_start = 0;
PROJECT_PATTERN = PROJECT_PATTERN; //JMP "feature", 00075244
SUBSITE_PATTERN = SUBSITE_PATTERN; //JMP "feature", 00075244
DATASTART_PATTERN = DATASTART_PATTERN; //JMP "feature", 00075244
For Each({line, idx}, lines,
If(!IsMissing(Regex(line, PROJECT_PATTERN)),
matches = Regex Match(line, PROJECT_PATTERN);
projname = matches[2];
lotid = matches[3];
waferid = matches[4];
time = matches[5];
notes = matches[6];
reticles = Words(Trim Whitespace(matches[7]), " ");
, !IsMissing(Regex(line, SUBSITE_PATTERN)),
subsite = Regex(line, SUBSITE_PATTERN, "\1");
, !IsMissing(Regex(line, DATASTART_PATTERN)),
data_start = idx;
break();
);
);
data_str = Concat Items(lines[data_start::N Items(lines)], "\!N");
dt = Open(Char To Blob(data_str), "text", invisible);
For Each({colname}, Reverse(dt << Get Column Names("String")), // drop empty columns
If(Col Number(Column(dt, colname)) == 0,
dt << Delete Column(colname);
,
break(); // break on first "ok" column
);
);
// define order and names here
dt << New Column("project", Character, Nominal, Set Each Value(projname));
dt << New Column("lot", Character, Nominal, Set Each Value(lotid));
dt << New Column("waferid", Character, Nominal, Set Each Value(waferid));
dt << New Column("time", Character, Nominal, Set Each Value(time));
dt << New Column("notes", Character, Nominal, Set Each Value(notes));
dt << New Column("x", Character, Nominal, Set Each Value(reticles[1]));
dt << New Column("y", Character, Nominal, Set Each Value(reticles[2]));
dt << New Column("subsite", Character, Nominal, Set Each Value(subsite));
dt << Move Selected Columns({:project, :lot, :waferid, :time, :notes, :x, :y, :subsite}, To First);
dt << Delete Columns("DataName");
return(dt);
);
// Start parsing
filepath = "$DOWNLOADS/Raw data examples_3DP.csv";
txt = Load Text File(filepath);
lines = Words(txt, "\!N");
lines = Filter Each({line}, lines, line != EMPTY_LINE); // drop empty lines
{start, end} = find_test_section_lines(lines);
dt_result = Empty();
While(All(start, end),
cur_testset = Remove From(lines, start, end - 1);
dt = parse_test_section(cur_testset);
If(Is Empty(dt_result),
dt_result = dt;
,
dt_result << Concatenate(
dt,
"Append to first table"
);
Close(dt, no save);
);
{start, end} = find_test_section_lines(lines);
);
dt_result << Show Window(1);

Betreff: Anfängerfrage zur Datentabellenerstellung (Extraktion) aus RohsondendatenHier ist ein Skript, das alle drei Projektdaten aus Ihrer Beispiel-CSV-Datei einliest und drei separate Datentabellen erstellt.
names default to here(1);
file = pick file();
dt = Open(
File,
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Comma, CSV( 0 ) ),
Treat Leading Zeros as Character( 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( 0 ),
Column Names Start( 1 ),
First Named Column( 1 ),
Data Starts( 1 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
// Change column names to simplify coding
for( i=1,i<=ncols(dt), i++, column(i)<< set name( "C" || char(i)));
// Loop through the data
for(theRow = 1, theRow <= NRows(dt), theRow++,
If( dt:C1[theRow] == "SetupTitle",
memoryProjectName = "";
memoryLotName = "";
memoryWaferID = "";
memoryT0 = "";
memory1strun = "";
memoryIndexX = .;
memoryIndexY = .;
setupFlag = 1;
projFlag = 0;
,
dt:C1[theRow] == "" & setupFlag == 1,
projFlag = 1;
setupFlag = 0;
,
projFlag == 1 & dt:C1[theRow] != "",
dt:C1[theRow] = trim(dt:C1[theRow]);
memoryProjectName = word(1, dt:C1[theRow], "_");
memoryLotName = word(2, dt:C1[theRow], "_W");
memoryWaferID = word(3, dt:C1[theRow], "_W");
memoryT0 = word(4, dt:C1[theRow], "_W");
memory1strun = word(5, dt:C1[theRow], "_W:");
memoryIndexX = num(word(2, dt:C1[theRow], ": "));
memoryIndexY = num(word(3, dt:C1[theRow], ": "));
projFlag = 0;
,
dt:C1[theRow] == "DataName",
colList = {};
col=2;
while( column(dt,col)[theRow] != "",
insert into(colList, column(dt,col)[theRow]);
col++
);
dtOut = New Table( "Lot " || memoryLotName || " WaferID " || memoryWaferID,
new column( "Project Name", character),
new column( "Lot Name", character),
new column( "WaferID", character),
new column( "Time Readout", character),
new column( "Personal Note", character),
new column( "Index X", numeric, ordinal),
new column( "Index Y", numeric, ordinal)
);
for each( {colName}, colList,
dtOut << new column( eval(colName), numeric, continuous);
);
,
dt:C1[theRow] == "DataValue",
dtOut << Add Rows(1);
dtOut:Project Name[nrows(dtOut)] = memoryProjectName;
dtOut:Lot Name[nrows(dtOut)] = memoryLotName;
dtOut:WaferID[nrows(dtOut)] = memoryWaferID;
dtOut:Time Readout[nrows(dtOut)] = memoryT0;
dtOut:Personal Note[nrows(dtOut)] = memory1strun;
dtOut:Index X[nrows(dtOut)] = memoryIndexX;
dtOut:Index Y[nrows(dtOut)] = memoryIndexY;
for each( {colName, index}, colList,
column( dtOut, colName )[nrows(dtOut)] = column(dt,index+1)[theRow]
)
)
);
Betreff: Anfängerfrage zur Datentabellenerstellung (Extraktion) aus RohsondendatenHallo txnelson , gut gesagt. Entschuldigen Sie meine Faulheit. Ich weiß, dass ich die Antwort selbst herausfinden könnte, wenn ich Zeit investiere (und es tut mir auf lange Sicht gut), aber ich fühlte mich unter Druck gesetzt, so schnell wie möglich die richtige Antwort zu bekommen.
Ich werde zurückkommen und Neulingen helfen, wie Sie es getan haben, wenn ich Erfahrung habe. Ich denke, dies ist eine echte Benutzergemeinschaft, in der sich jeder gegenseitig hilft. Jede Antwort ist auf die individuellen Bedürfnisse zugeschnitten. JMP sollte die aktiven Benutzer hier wirklich motivieren. Ich hoffe, Ihre Antwort in diesem Thread wird auch anderen technischen Benutzern von Nutzen sein.
Betreff: Anfängerfrage zur Datentabellenerstellung (Extraktion) aus RohsondendatenHallo txnelson , es funktioniert! Ich werde dieses Skript buchstäblich für meinen Bericht nächste Woche brauchen. Danke!!!~~~
Könnten Sie in der Zwischenzeit einige Verbesserungen vornehmen, wenn es nicht zu kompliziert ist?
1. Die Subsite-Info (Spalte) fehlt.
//Um zukünftigen Betrachtern zu helfen: Ein Wafer hat mehrere Retikel (auch Stepper Field oder Die genannt); jedes Retikel hat seinen eigenen eindeutigen (Index X, Index Y); jedes Retikel hat zahlreiche Geräte, die als „Subsite“ (auch Subdie genannt) bezeichnet werden. Die Messung erfolgt pro Subsite-Retikel-Wafer.

2. Alle DPs in einer einzigen JMP-Tabelle ausgeben
//Ohne zu viel nachzudenken, habe ich Ihr Skript auf meine vollständige Rohdatei (Hunderte von DPs ...) angewendet. Sie können sich vorstellen, was passiert ist: Ich habe mit zahlreichen ständig erscheinenden JMP-Fenstern gekämpft und schließlich aufgegeben, indem ich mich an den Task-Manager gewandt habe ...
3. Ändern Sie die Spalteneigenschaften des Datentabellenteils von Zeichen in Numerisch.
4. Ist es möglich, die Codierung in ein prägnanteres Format zu komprimieren?
//Der aktuelle Code ist sehr intuitiv, für mich als Anfänger großartig. Aber auf lange Sicht könnte ein kürzerer Code benutzerfreundlicher sein. Bitte vergessen Sie es, wenn er kompliziert oder nicht mehr für Erstanwender geeignet ist.
Betreff: Anfängerfrage zur Datentabellenerstellung (Extraktion) aus RohsondendatenHallo jthi , du hast meinen Dank! Ich werde mir später auf jeden Fall die Zeit nehmen, mehr über diese Regex-Funktion zu erfahren.
Ich hoffe, dieser Thread gibt mir nicht nur die Antworten, die ich brauche (das wäre wirklich nett), sondern dient auch als Vorlage für ähnliche Scan- und Extraktionsaufgaben im JMP-Format. Ich werde alle Skripte für meine zukünftigen Jobs speichern!
Um noch etwas zu diesem Thema beizutragen: Das wahrscheinlichste Problem bei der Verwendung solcher Skripte ist die Konsistenz des Job-ID-Formats . Achten Sie genau darauf, wie Sie die Job-ID erstellen, und ändern Sie sie nicht willkürlich, da dies die Programmierung verzerren würde, wenn Sie sie nicht befolgen. Um zwei Beispiele zu nennen: Mein Standardformat für die Job-ID ist: Projname_Lot-ID_Wafer-ID_persönlich Hinweis: Index X Index Y
Da es sich jedoch um einen Benchtest handelt und ich alle Tests manuell benannt habe, gab es einige Fälle, in denen ich selbst gegen die Regel verstoßen habe und dem oben beschriebenen Stil NICHT GENAU gefolgt bin:
1. Das „_“ zwischen der Lot-ID und der Wafer-ID fehlte, d. h. statt „753367.1_W11“ habe ich in einigen Fällen „753367.1W11“ eingegeben.
2. habe zwei persönliche Notizen hinzugefügt statt einer: z. B. wenn ich nach dem 1. Durchlauf einen erneuten Test durchführe, habe ich statt „_2nd_“ „_1st_redo_“ verwendet. Da ich „_“ als Infoabschnittsteiler verwende, würde es dort und bei allem, was diesem Abschnitt folgt, Probleme geben, da die Zählung durcheinander gerät.
Nochmals vielen Dank an jthi und txnelson, die mir bei meinen ersten Schritten im erweiterten JMP-Scripting geholfen haben!
Betreff: Anfängerfrage zur Datentabellenerstellung (Extraktion) aus RohsondendatenAbhängig von Ihrer Anwendung können Sie den Parser möglicherweise robuster machen, indem Sie nach sich wiederholenden Mustern suchen, anstatt sich auf Regex-Muster zu verlassen, die bestimmten Zeilen entsprechen. Beispielsweise sieht es so aus, als ob Ihr Projektname beispielsweise zwischen Metadatenzeilen steht

Abhängig von den Annahmen, die Sie treffen können, könnten Sie es basierend auf diesen Metadaten und „leeren“ Zeilen extrahieren, anstatt sich auf „Zeile beginnt mit Proj“ oder „Zeile entspricht diesem Regex-Muster“ zu verlassen.
Betreff: Anfängerfrage zur Datentabellengenerierung (Extraktion) aus Rohdaten der ProbeHallo Jthi,
Irgendwie erhalte ich diesen Fehler beim Ausführen dieses Skripts. Können Sie mir bitte weiterhelfen?

Betreff: Anfängerfrage zur Datentabellengenerierung (Extraktion) aus Rohdaten der ProbeInteressanter Punkt, jthi. Werde darüber nachdenken.
Beachten Sie, dass die Informationen in der Job-ID-Zeile eingebettet sind. Das Hauptproblem besteht darin, die Informationen zu extrahieren, nicht darin, sie zu finden. Meine Lektion ist, die Konsistenz der „Zeile beginnt mit Proj“ zu gewährleisten. Sehr, sehr wichtig. Um dies zu bestätigen, könnten wir ein Musterüberprüfungsskript hinzufügen und sicherstellen, dass die extrahierten Informationen den Erwartungen entsprechen. Regex ist hierfür ein intuitives Werkzeug.
Betreff: Anfängerfrage zur Datentabellengenerierung (Extraktion) aus Rohdaten der ProbeHaben Sie TEST_SECTION_END definiert?
Betreff: Anfängerfrage zur Datentabellengenerierung (Extraktion) aus Rohdaten der ProbeJa, ich verwende dasselbe Skript, das Sie zuvor gepostet haben.

Betreff: Anfängerfrage zur Datentabellengenerierung (Extraktion) aus Rohdaten der ProbeAh ... sie wurden aus irgendeinem Grund in meinem Skript gelöscht, und Sie müssen TEST_SECTION_END bestimmen. Auf den ersten Blick könnte es dasselbe sein wie EMPTY_LINE.