Leggi file di testo, trova righe contenenti una determinata stringaCiao a tutti,
Ecco uno script che ho che funziona. Voglio sapere se esiste un modo migliore per fare la stessa cosa.
Per prima cosa utilizzo "carica file di testo" per leggere un file di testo nella variabile stringa "file_text1".
Successivamente, utilizzo "parole" con "\!n" per separare le righe e caricarle nell'array di stringhe "file_text2".
Successivamente, carico "file_text2" in una tabella dati. Quindi utilizzo "ottieni righe dove" combinato con "contiene" per trovare il numero di riga nel file di testo originale che contiene una determinata stringa.
Esiste una funzione equivalente a "ottieni righe dove" ma utilizzabile per gli array di stringhe? In questo modo, posso saltare la parte da caricare nella tabella dati.
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") );Modellazione statistica avanzataAutomazione e scriptingRicerche sui consumatori e sul mercatoOrganizzazione dei contenutiCombinazione e pulizia dei datiPersonalizzazione di massaIngegneria della qualità e dei processiRi: Leggi file di testo, trova righe contenenti una determinata stringaGrazie a tutti e soprattutto a Jthi.
Ho determinato che l'utilizzo di un ciclo for su N elementi (file_text2) era più veloce rispetto all'utilizzo di una tabella dati. E poi ho visto il metodo di jthi che utilizza "For Each", che dalle misurazioni del tempo è ancora più veloce.
Ri: Leggi file di testo, trova righe contenenti una determinata stringaC'è anche For Each, Filter Each (e Transform Each) che può aiutare con casi come questo e dovrebbe essere abbastanza veloce.
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);
Ri: Leggi file di testo, trova righe contenenti una determinata stringaPersonalmente, ho creato una funzione Map(), Filter() e Reduce() per problemi come questo.Ecco un esempio che utilizza la funzione Map() e sul mio sistema è circa il 50% - 60% più veloce rispetto alla creazione di una tabella per eseguire la ricerca.
Ecco la funzione map (esplicitamente globalizzata):
::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__
);ed ecco un confronto tra l'utilizzo di una tabella e la funzione 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 1A parte definire la funzione map, il suo utilizzo è solitamente molto più pulito nel codice rispetto a qualsiasi altra soluzione.
Ri: Leggi file di testo, trova righe contenenti una determinata stringaEcco un altro modo per gestire la situazione.Potrebbe essere più veloce o più lento...non lo so.
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") );