Leer archivo de texto, buscar líneas que contengan una determinada cadenaHola a todos,
Aquí hay un script que tengo que funciona. Quiero saber si hay una mejor manera de hacer lo mismo.
Primero uso "cargar archivo de texto" para leer un archivo de texto en la variable de cadena "file_text1".
A continuación, uso "palabras" con "\!n" para separar las líneas y cargarlas en la matriz de cadenas "file_text2".
Luego, cargo el "file_text2" en una tabla de datos. Luego uso "obtener filas donde" combinado con "contiene" para encontrar el número de línea en el archivo de texto original que contiene una determinada cadena.
¿Existe una función equivalente a "obtener filas donde" pero utilizable para matrices de cadenas? De esta manera, puedo omitir la parte para cargar en la tabla de datos.
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") );secuencias de comandosRe: Leer archivo de texto, buscar líneas que contengan una determinada cadenaGracias a todos y especialmente a jthi.
He determinado que usar un bucle for en N elementos (file_text2) fue más rápido que usar una tabla de datos. Y luego vi el método de jthi usando "Para cada uno", que a partir de las mediciones de tiempo es aún más rápido.
Re: Leer archivo de texto, buscar líneas que contengan una determinada cadenaTambién hay For Each, Filter Each (y Transform Each) que pueden ayudar con casos como este y debería ser bastante rápido.
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: Leer archivo de texto, buscar líneas que contengan una determinada cadenaPersonalmente, he creado una función Map(), Filter() y Reduce() para problemas como este.Aquí hay un ejemplo que usa la función Map () y en mi sistema es aproximadamente un 50% - 60% más rápido que crear una tabla para realizar la búsqueda.
Aquí está la función de mapa (explícitamente globalizada):
::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__
);y aquí hay una comparación entre el uso de una tabla y la función de mapa:
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 1Además de definir la función de mapa, su uso suele tener un aspecto mucho más limpio en el código que cualquier otra solución.
Re: Leer archivo de texto, buscar líneas que contengan una determinada cadenaAquí hay otra manera de manejar esto.Puede ser más rápido, o puede ser más lento... No lo sé.
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") );