JSL 테이블 가져오기 - 원하는 행 번호가 가변적일 때 올바른 행을 헤더로 선택입력 목록을 사용하여 디렉터리에서 파일을 가져오는 스크립트가 있습니다.파일 형식이 특이해서 약간의 조작이 필요하고 각 파일이 60Mb 정도이므로 가져오는 데 내가 원하는 것보다 더 많은 시간이 걸릴 수 있습니다.내 문제는 대부분의 파일에 원하는 헤더 행이 15행에 있지만 파일의 약 10%에 행 10-14에 헤더가 있을 수 있으며 파일을 열 때까지 알 수 있는 방법이 없다는 것입니다.
현재 해결책은 스크립트에서 처음 20개 행을 열고, 헤더가 포함된 행을 검색하고, 해당 행 번호를 변수에 할당하고, 해당 dt를 닫은 다음 다시 열되, 변수를 헤더로 사용하고 변수 + 1을 변수로 사용하는 것입니다. 첫 번째 줄.작동하지만 이 파일을 두 번 여는 것을 의미합니다. 하나는 제한된 미리 보기일 뿐입니다.
1) 더 좋은 방법이 있나요?
2) 질문이 있는데, 테이블을 가져오면서 이름을 기준으로 원하는 열만 가져오는 방법이 있습니까?내 파일에는 약 1000개의 열이 있는데 그중 15개만 필요합니다.
Re: JSL 테이블 가져오기 - 원하는 행 번호가 가변적일 때 올바른 행을 헤더로 선택그 쪽이 맞는 거 같아요; 문자열을 표현식으로 변환하려면 구문 분석()을 사용해야 할 수도 있습니다.
문자열을 피하고 표현식을 직접 조작하는 또 다른 접근 방식은 다음과 같습니다.
// testing data (I modified your end of field with a tab, below)
filelist = {"$sample_data\..\Import Data\bigclass.txt"};
x = 1;
// build an expression with a placeholder COLUMNSEXPR
openstmt = Expr(
Open(
FileList[x],
COLUMNSEXPR, // << placeholder for columns(...)
Import Settings( End Of Line( CRLF, CR, LF ), End Of Field( tab, CSV( 0 ) ),
Strip Quotes( 1 ), Column Names Start( 1 ), Data Starts( 1 ) )
)
);
// if you run the openstmt function now, it will import all the columns
//
// eval(openstmt);
// build a list using {} to make it easy to manipulate
COLUMNSLIST = {};
// insert the column you want to keep
Insert Into( COLUMNSLIST, Expr( New Column( "Col1", Character, "Nominal" ) ) );
// insert 5 omit columns...
For( i = 1, i < 5, i += 1,
Insert Into( COLUMNSLIST, Expr( Omitted Column( . ) ) )
);
// COLUMNSLIST looks like this:
//{New Column( "Col1", Character, "Nominal" ), Omitted Column( . ),
//Omitted Column( . ), Omitted Column( . ), Omitted Column( . )}
// convert the {...} to columns(...)
Substitute Into( COLUMNSLIST, Expr( {} ), Expr( columns ) );
//show(nameexpr(COLUMNSLIST)); shows this:
//columns(New Column("Col1", Character, "Nominal"),
//Omitted Column(.), Omitted Column(.),
//Omitted Column(.), Omitted Column(.))
//
// if you leave out the nameexpr() it will (try to) evaluate rather than
// retrieving the expression for display. columns() is not a function in
// JSL, so evaluating makes an error message.
// nameexpr(openstmt) still show COLUMNSEXPR. replace it:
Substitute Into( openstmt, Expr( COLUMNSEXPR ), Name Expr( COLUMNSLIST ) );
// nameexpr(openstmt) is now
//Open(
// FileList[x],
// columns(
// New Column( "Col1", Character, "Nominal" ),
// Omitted Column( . ),
// Omitted Column( . ),
// Omitted Column( . ),
// Omitted Column( . )
// ),
// Import Settings(
// End Of Line( CRLF, CR, LF ),
// End Of Field( tab, CSV( 0 ) ),
// Strip Quotes( 1 ),
// Column Names Start( 1 ),
// Data Starts( 1 )
// )
//)
Eval( openstmt ); // reads just the first column of the table표현식 대신 텍스트를 조작하여 유사한 작업을 수행할 수도 있습니다.
eval(parse( " the text you built ") )
가장 편한 기술을 사용하십시오. 표현식을 조작하는 속도는 약간 향상되지만 디스크에서 파일을 읽는 것과 비교하면 미미합니다.
위의 마지막 명령문은 열 파일을 선택하기 위해 여전히 X 값에 의존하므로 표현식을 다시 작성할 필요가 없습니다.
Re: JSL 테이블 가져오기 - 원하는 행 번호가 가변적일 때 올바른 행을 헤더로 선택@Craige_Hales
이러한 .csv 형식의 파일을 가져오기 위한 코드를 단축하는 방법을 찾고 있습니다.현재 약 1000개의 열이 있는 가져오기와 약 360개의 열이 있는 가져오기가 있는데 이는 이제 "FileList"라는 목록에 있는 수백 개의 파일을 반복합니다.위에서 설명한 이유로 열 1만 가져오고 싶습니다.내 현재 코드는 다음과 같습니다
For( x = 1, x <= N Items( FileList ), x++,
dt = Open(
FileList[x],
eval(columns(
New Column( "Col1", Character, "Nominal" ),
Omitted Column( . ),
Omitted Column( . ),
Omitted Column( . ), <FONT color="#FF0000">(repeated 400 times!)</FONT>
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Spaces, Space, CSV( 0 ) ),
Strip Quotes( 1 ),
Column Names Start( 1 ),
Data Starts( 1 ),
),
//invisible
);하지만 eval() 유형 표현식을 사용하는 방법을 알아내려고 했지만 제대로 수행하지 못했습니다.여러 곳에서 eval() 표현식을 시도해 보았지만 이해할 수 없는 것 같습니다.저는 eval()을 처음 사용합니다.내 문제는 내 변수 "생략"이 결국 문자열이 되지만 따옴표로 묶인 것일 수도 있다고 생각합니다.
<FONT color="#339966"> Omit</FONT> = repeat("Omitted Column( . ),",400)||"Omitted Column( . )";
For( x = 1, x <= N Items( FileList ), x++,
dt = Open(
FileList[x],
<FONT color="#FF0000">eval(</FONT>columns(
New Column( "Col1", Character, "Nominal" ),
<FONT color="#339966">Omit</FONT><FONT color="#FF0000">);</FONT>
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Spaces, Space, CSV( 0 ) ),
Strip Quotes( 1 ),
Column Names Start( 1 ),
Data Starts( 1 ),
),
);
Re: JSL 테이블 가져오기 - 원하는 행 번호가 가변적일 때 올바른 행을 헤더로 선택도움이 되셨다니 기쁘네요. 위시리스트에 담아볼만한 가치가 있는 아이템인 것 같습니다.
Re: JSL 테이블 가져오기 - 원하는 행 번호가 가변적일 때 올바른 행을 헤더로 선택고마워요 크레이지. 열 헤더가 있는 행을 가져오기 위한 초기 가져오기의 경우 귀하의 조언을 사용하고 열 2~1000에 대해 생략 열을 사용했기 때문에 20개 행이 있는 열 1만 가져오고 필요한 항목을 가져온 다음 닫습니다. 그런 다음 파일을 다시 열지만 루프의 첫 번째 부분에서 얻은 정보를 사용하여 열 머리글 행을 적절하게 선택합니다.
루프의 두 번째 부분에 대해 특정 열을 가져오는 더 좋은 방법이 있었으면 좋겠습니다. 제 상황에서는 원시 입력 파일의 열이 시간이 지남에 따라 제가 모르는 사이에 순서와 수량을 변경할 가능성이 높습니다. 가져오려는 열만 이름으로 지정할 수 있는 기능이 JMP에 있다면 정말 좋을 것 같습니다.Re: JSL 테이블 가져오기 - 원하는 행 번호가 가변적일 때 올바른 행을 헤더로 선택1) 두 가지 가져오기가 아마도 가장 쉬운 방법이고 더 빠르게 이루어질 수 있다고 생각합니다...
2) 가져올 열보다 더 많은 것을 지정해야 하지만 속도 향상에는 그만한 가치가 있습니다.
use the text import wizard to mark the unwanted columnsuse the text import wizard to mark the unwanted columns텍스트 가져오기 마법사를 사용하여 원하지 않는 열 표시
Grab the source script, it has the JSL to omit columnsGrab the source script, it has the JSL to omit columns소스 스크립트를 가져오세요. 열을 생략하는 JSL이 있습니다.
(1000개의 생략된 열의 경우 GUI를 사용하여 제외하는 것보다 JSL을 편집하는 것이 더 쉬울 수 있습니다.)
이제 소스 스크립트를 조정할 수 있습니다. 아래에서는 처음 100줄을 읽습니다. (1) 열에 대한 모든 것이 지정되고 (2) 100줄 이후에 멈추기 때문에 빠릅니다. 이 데이터의 경우 Labels(0) 및 DataStarts(1)을 지정해야 합니다.
Open(
"f:\logOriginalAntenna.txt",// 100MB file takes about 2 seconds to load 100 lines
columns(
Omitted Column( . ),// use the import wizard to
Omitted Column( . ),// get a source script with
Omitted Column( . ),// omitted columns
New Column( "c000004",
Numeric,
"Continuous",
Format( "yyyy-mm-ddThh:mm:ss", 23, 3 ),
Input Format( "yyyy-mm-ddThh:mm:ss", 3 )
),
New Column( "c000005", Character, "Nominal" )
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, Comma, CSV( 1 ) ),
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( 1 ),
Column Names Start( 1 ),
Data Starts( 2 ),
Lines To Read( 100 ),// specify the number of rows
Year Rule( "20xx" )
)
)
파일의 열 순서가 항상 동일한 경우 위의 형식을 명시적으로 지정하면 JMP가 파일을 가져오기 전에 파일을 연구할 필요가 없습니다. 내 생각에 JMP는 아직도 전체 100줄에서 멈춰도 파일을 생성할 수 있으므로 처리 시간이 많이 단축될 수 있습니다.
파일의 열 수나 열 순서가 항상 동일하지 않은 경우에는 작동하지 않습니다. 단일 가져오기를 사용하여 테이블을 가져오고, 열 이름과 데이터 유형을 수정하고, 원하지 않는 행을 삭제할 수 있습니다.