Lire un fichier texte, rechercher des lignes contenant une certaine chaîneBonjour à tous,
Voici un script que j'ai et qui fonctionne. Je veux savoir s'il existe une meilleure façon de faire la même chose.
J'utilise d'abord "charger un fichier texte" pour lire un fichier texte dans la variable chaîne "file_text1".
Ensuite, j'utilise "words" avec "\!n" pour séparer les lignes et les charger dans le tableau de chaînes "file_text2".
Ensuite, je charge ensuite le "file_text2" dans une table de données. J'utilise ensuite "obtenir les lignes où" combiné avec "contient" pour trouver le numéro de ligne dans le fichier texte d'origine qui contient une certaine chaîne.
Existe-t-il une fonction équivalente à « obtenir les lignes où » mais utilisable pour les tableaux de chaînes ? De cette façon, je peux ignorer la partie à charger dans le tableau de données.
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") );Modélisation statistique avancéeAutomatisation et scriptsÉtudes de consommation et de marchéOrganisation du contenuMélange et nettoyage des donnéesPersonnalisation de masseIngénierie Qualité et ProcédésRe : Lire un fichier texte, rechercher des lignes contenant une certaine chaîneMerci à tous et surtout à jthi.
J'ai déterminé que l'utilisation d'une boucle for sur N Items (file_text2) était plus rapide que l'utilisation d'une table de données. Et puis j'ai vu la méthode de jthi utilisant "For Each", qui, à partir des mesures de temps, est encore plus rapide.
Re : Lire un fichier texte, rechercher des lignes contenant une certaine chaîneIl existe également For Each, Filter Each (et Transform Each) qui peuvent aider dans des cas comme celui-ci et cela devrait être assez rapide.
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);
Re : Lire un fichier texte, rechercher des lignes contenant une certaine chaînePersonnellement, j'ai créé une fonction Map(), Filter() et Reduction() pour des problèmes comme celui-ci.Voici un exemple utilisant la fonction Map() et sur mon système, c'est environ 50 à 60 % plus rapide que la création d'une table pour effectuer la recherche.
Voici la fonction map (explicitement globalisée) :
::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__
);et voici une comparaison entre l'utilisation d'une table et la fonction map :
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 1En plus de définir la fonction map, son utilisation est généralement beaucoup plus propre dans le code que toute autre solution.
Re : Lire un fichier texte, rechercher des lignes contenant une certaine chaîneVoici une autre façon de gérer cela.Cela peut être plus rapide ou plus lent... Je ne sais pas.
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") );