문제
다중 파일 가져오기를 사용하지 않고 디렉토리의 파일을 사용하여 데이터 테이블 연결
해결책
디렉토리에 있는 파일을 사용하여 목록을 만들고 연결하여 함께 넣습니다.
// make a test directory
dt = New Table( "Untitled", Add Rows( 1 ), New Column( "a" ), New Column( "b" ) );
path = "$TEMP/test/";
Delete Directory( path ); // Be careful! This will delete your files!
Create Directory( path );
For( i = 1, i <= 3, i += 1,
dt:a = i; // make each table a little different
dt:b = 10 * i;
dt << save( path || Char( 1000 + i ) ); // make the table names sort
);
Close( dt, nosave );
// here's the code to open and concatenate...
namelist = Files In Directory( path );
Sort List Into( namelist ); // not really needed?
dtlist = {}; // hold the opened, hidden, tables here
While( N Items( filename = Remove From( namelist, 1 /*first item*/ ) ) == 1,
filename = filename[1]; // {dt} -> dt
filename = path || filename; // prepend path name
// inserts opened table at end of dtlist
Insert Into( dtlist, Open( filename, invisible ) );
);
rememberdt = dtlist; // need these later to close the hidden tables
firstdt = Remove From( dtlist, 1/*first item*/ )[1]; // need one to start
If( N Items( dtlist ), // concatenate needs more than one table
resultdt = firstdt << Concatenate( dtlist, Create source column )
, // subset returns a fresh table, like concatenate, so both cases have same behavior
resultdt = firstdt << Subset( All rows, Selected columns only( 0 ) )
);
// clean up the hidden tables
While( N Items( closedt = Remove From( rememberdt ) ) == 1, Close( closedt[1], nosave ) );
// clean up new table
resultdt << setname( "all my tables" );
resultdt << deletetableproperty( "Source" ); // from subset or concatenate
//
Print( "done", resultdt );
논의
JMP 14는 다중 파일 가져오기를 도입했습니다. @우 일부 테이블 속성을 보존하지 않는 것으로 나타났습니다. (JMP 15가 더 나을 것이지만 아직 사용할 수 없습니다.)
이 예제의 첫 번째 부분에서는 DeleteDirectory 및 CreateDirectory를 사용하여 테스트를 위한 깨끗한 샘플 파일 집합을 만듭니다. JMP 테이블이 이전 시도에서 아직 열려 있는 경우 DeleteDirectory가 실패함을 발견할 수 있습니다. 숨겨진 경우에도 테이블 위젯을 사용하여 수동으로 테이블을 닫을 수 있습니다.
Click the table icon beside the widget to open the hidden tableClick the table icon beside the widget to open the hidden table숨겨진 테이블을 열려면 위젯 옆에 있는 테이블 아이콘을 클릭하십시오.
동일한 코드에서 파일 이름에 1000을 추가하여 파일을 잘 정렬합니다( 1,10,2,3,4,5,6,7,8,9 아님). 경로 변수에는 후행 슬래시가 있으므로 슬래시를 다른 위치에 추가할 필요가 없습니다.
namelist는 Files In Directory에 의해 초기화됩니다. dtlist는 빈 목록으로 초기화됩니다. 이름 목록에서 이름이 하나씩 제거되고 열립니다(숨김). 열린 테이블은 dtlist에 하나씩 저장됩니다. (테이블의 내용이 아니라 테이블에 대한 포인터 또는 핸들일 뿐입니다.)
그런 다음 dtlist 항목이 둘 이상인 경우 concatenate는 이들 항목에서 새 테이블을 만듭니다. (concatenate가 테이블 목록을 허용한다는 사실이 기뻤습니다.) 하나만 있는 경우 하위 집합이 복사본을 만듭니다. 복사본을 만들면 연결이 만들어진 것처럼 저장되지 않은 테이블이 만들어지므로 두 경우 모두 결과가 비슷합니다.
정리는 숨겨진 테이블을 제거하고 결과 테이블의 이름을 바꾸고 결과에서 소스 스크립트를 제거합니다. 소스 스크립트를 유지하려고 할 수 있습니다. 이 예제는 마지막에 디렉토리 삭제를 사용할 수도 있지만 실제 소스 파일에 그렇게 하는 것은 아마도 나쁜 생각일 것입니다.
또한보십시오
디렉터리 내 파일
데이터 테이블 연결
MFI의 약점인 여러 Excel 파일을 가져오기 위한 정말 훌륭한 스니펫입니다.
또한 MFI에서는 불가능한 열 수가 약간 다른 파일을 강제로 연결하는 데 도움이 되었습니다.
두 개의 헤더 줄이 있는 Excel 파일을 가져오는 데 도움이 되는 Open()을 사용할 때 추가 옵션을 지정할 수도 있습니다.
While( N Items( filename = Remove From( namelist, 1 /*first item*/ ) ) == 1,
filename = filename[1]; // {dt} -> dt
filename = path || filename; // prepend path name
// inserts opened table at end of dtlist
Insert Into( dtlist, Open( filename, invisible, Worksheets( "MyWorksheet" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 2 ),
Headers Start on Row( 1 ),
Data Starts on Row( 3 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
) ) );
);
여기 새로운 사용자가 있으며 여러 세트의 데이터를 통합하려고 할 때 이것이 매우 유용하다는 것을 알았습니다. 감사해요!