Textdatei lesen, Zeilen suchen, die eine bestimmte Zeichenfolge enthaltenHallo zusammen,
Hier ist ein Skript, das ich habe und das funktioniert. Ich möchte wissen, ob es einen besseren Weg gibt, dasselbe zu tun.
Ich verwende zunächst „Textdatei laden“, um eine Textdatei in die String-Variable „file_text1“ einzulesen.
Als nächstes verwende ich „words“ mit „\!n“, um die Zeilen zu trennen und sie in das String-Array „file_text2“ zu laden.
Als nächstes lade ich dann „file_text2“ in eine Datentabelle. Anschließend verwende ich „get rows where“ in Kombination mit „contains“, um die Zeilennummer in der Originaltextdatei zu finden, die eine bestimmte Zeichenfolge enthält.
Gibt es eine Funktion, die „Zeilen wohin abrufen“ entspricht, aber für String-Arrays verwendbar ist? Auf diese Weise kann ich den Teil überspringen, der in die Datentabelle geladen werden soll.
file_text1 = load text file( "example.txt" );
file_text2 = words(file_text1 , "\!n");
dt0 = new table("file_dt", new column("file_content", character) );
dt0:file_content << set values(file_text2);
pass_qty_row_array = dt0 << get rows where(contains( :file_content, "Pass") );Erweiterte statistische ModellierungAutomatisierung und SkripterstellungVerbraucher- und MarktforschungInhaltsorganisationDatenmischung und -bereinigungMassenanpassungQualitäts- und VerfahrenstechnikBetreff: Textdatei lesen, Zeilen suchen, die eine bestimmte Zeichenfolge enthaltenVielen Dank an alle und besonders an Jthi.
Ich habe festgestellt, dass die Verwendung einer for-Schleife für N Elemente (file_text2) schneller war als die Verwendung einer Datentabelle. Und dann habe ich Jthis Methode mit „For Each“ gesehen, die aus Zeitmessungen sogar noch schneller ist.
Betreff: Textdatei lesen, Zeilen suchen, die eine bestimmte Zeichenfolge enthaltenEs gibt auch For Each, Filter Each (und Transform Each), die in solchen Fällen hilfreich sein können und ziemlich schnell sein sollten.
Names Default To Here(1);
file_txt = Load Text File("$SAMPLE_IMPORT_DATA/Animals.txt");
file_list = words(file_txt, "\!n");
search_word = "fall";
pass_qty_row_array = [];
For Each({line, idx}, file_text2,
If(Contains(line, search_word),
Insert Into(pass_qty_row_array, idx);
);
);
show(pass_qty_row_array);
Betreff: Textdatei lesen, Zeilen suchen, die eine bestimmte Zeichenfolge enthaltenPersönlich habe ich für Probleme wie dieses eine Map()-, Filter()- und Reduce()-Funktion erstellt.Hier ist ein Beispiel für die Verwendung der Map()-Funktion. Auf meinem System ist es etwa 50–60 % schneller, als eine Tabelle für die Suche zu erstellen.
Hier ist die Kartenfunktion (explizit globalisiert):
::map = Function( {inputs /* list, function */ },
/* uses a single underscore _ as the wild-card */
{__i__, __result__, __list__, _, __, __keys__},
__list__ = Eval( Arg( inputs, 1 ) );
If( Is List( __list__ ),
__result__ = {};
Eval(
Substitute(
Expr(
For( __i__ = 1, __i__ <= __N__, __i__++,
_ = __list__[__i__];
__result__[__i__] = __function__
)
)
,
Expr( __N__ ), N Items( __list__ ),
Expr( __function__ ), Arg( inputs, 2 )
);
);
,
Is Associative Array( __list__ ),
__result__ = [=>];
__keys__ = __list__ << Get Keys;
Eval(
Substitute(
Expr(
For( __i__ = 1, __i__ <= __N__, __i__++,
__ = __keys__[__i__];
_ = __list__[__];
__result__[__] = __function__
)
)
,
Expr( __N__ ), N Items( __keys__ ),
Expr( __function__ ), Arg( inputs, 2 )
)
)
);
__result__
);und hier ist ein Vergleich zwischen der Verwendung einer Tabelle und der Kartenfunktion:
Names Default To Here( 1 );
filename = Convert File Path( "$SAMPLE_IMPORT_DATA/UN Malaria 2009.csv", absolute, windows );
result = Load Text File( filename );
Show( result );
file_text2 = Words( result, "\!N" );
N = 10000;
word = "malaria";
s = HP Time();
Summation( i = 1, N,
dt0 = New Table( "file_dt", New Column( "file_content", character ), Private );
dt0:file_content << set values( file_text2 );
pass_qty_row_array 1 = dt0 << get rows where( Contains( :file_content, word ) );
close( dt0, No Save );
0
);
Show( time 1 = (HP Time() - s) / 1000000 );
s = HP Time();
Summation( i = 1, N,
pass_qty_row_array 2 = loc( Matrix( ::map({ file_text2, Contains( _, word ) }) ) );
0
);
Show( time 2 = (HP Time() - s) / 1000000 );<BR /><BR />Show( All( pass_qty_row_array 1 == pass_qty_row_array 2 ) );
1 - (time 1 - time 2) / time 1Abgesehen von der Definition der Kartenfunktion sieht ihre Verwendung im Code normalerweise viel sauberer aus als jede andere Lösung.
Betreff: Textdatei lesen, Zeilen suchen, die eine bestimmte Zeichenfolge enthaltenHier ist eine andere Möglichkeit, damit umzugehen.Es kann schneller oder langsamer sein ... Ich weiß es nicht.
names default to here(1);
dt0 = Open(
"example.txt",
columns( New Column( "Line", Character, "Nominal" ) ),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( CSV( 0 ) ),
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 ),
Data Starts( 1 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
pass_qty_row_array = dt0 << get rows where(contains( :file_content, "Pass") );