텍스트 파일 읽기, 특정 문자열을 포함하는 줄 찾기여러분, 안녕하세요,
다음은 작동하는 스크립트입니다. 동일한 작업을 수행하는 더 좋은 방법이 있는지 알고 싶습니다.
먼저 "텍스트 파일 로드"를 사용하여 텍스트 파일을 문자열 변수 "file_text1"로 읽습니다.
다음으로 "\!n"과 함께 "words"를 사용하여 줄을 구분하고 문자열 배열 "file_text2"에 로드합니다.
그런 다음 "file_text2"를 데이터 테이블에 로드합니다. 그런 다음 "contains"와 결합된 "get rows where"를 사용하여 특정 문자열이 포함된 원본 텍스트 파일에서 줄 번호를 찾습니다.
"get rows where"와 동일하지만 문자열 배열에 사용할 수 있는 함수가 있습니까? 이렇게 하면 데이터 테이블에 로드할 부분을 건너뛸 수 있습니다.
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") );고급 통계 모델링자동화 및 스크립팅소비자 및 시장 조사콘텐츠 구성데이터 혼합 및 정리대량 맞춤화품질 및 프로세스 엔지니어링Re: 텍스트 파일 읽기, 특정 문자열이 포함된 줄 찾기모두와 특히 jthi에게 감사드립니다.
N개의 항목(file_text2)에서 for-loop를 사용하는 것이 데이터 테이블을 사용하는 것보다 빠르다는 것을 확인했습니다. 그런 다음 "For Each"를 사용하는 jthi의 방법을 보았습니다. 시간 측정에서 훨씬 더 빠릅니다.
Re: 텍스트 파일 읽기, 특정 문자열이 포함된 줄 찾기이와 같은 경우에 도움이 될 수 있는 For Each, Filter Each(및 Transform Each)도 있으며 상당히 빠릅니다.
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: 텍스트 파일 읽기, 특정 문자열이 포함된 줄 찾기개인적으로 이런 문제를 해결하기 위해 Map(), Filter(), Reduce() 함수를 만들었습니다.다음은 Map() 함수를 사용하는 예이며 내 시스템에서는 검색을 수행하기 위해 테이블을 만드는 것보다 대략 50% - 60% 더 빠릅니다.
다음은 map 함수입니다(명시적으로 전역화됨).
::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__
);다음은 테이블과 맵 기능을 비교한 것입니다.
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 1맵 기능을 정의하는 것 외에도 일반적으로 이를 사용하는 것이 다른 솔루션보다 코드에서 훨씬 깔끔합니다.
Re: 텍스트 파일 읽기, 특정 문자열이 포함된 줄 찾기이것을 처리하는 또 다른 방법이 있습니다.더 빠를 수도 있고 더 느릴 수도 있습니다.....모르겠습니다.
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") );