동일한 구조를 가진 폴더에서 csv 파일을 추출하고 연결합니다.<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />안녕,
예를 들어 공통 이름을 가진 여러 폴더에 csv 파일이 있고 csv 파일은 동일한 구조에 있습니다.
<1번째 폴더>dfgdwgssd
<공통 이름을 가진 두 번째 폴더> commonname
xxx-공통이름.csv
스크립트를 사용하여 모든 csv 파일을 추출하고 연결하려고 합니다. bash 명령("for" 루프와 "find")을 사용하여 쉬운 방법을 찾았습니다. 누군가 나에게 도움을 줄 수 있습니까? 매우 감사합니다!
Re: 동일한 구조를 가진 폴더에서 csv 파일을 추출하고 연결합니다.다시 한 번 감사드립니다, 필!
저는 Mac을 사용하고 있는데 방금 Google에서 검색했는데 JMP에서 셸을 실행하는 방법에 대한 정보가 거의 없습니다. 몇 가지 예가 있습니까?
Re: 동일한 구조를 가진 폴더에서 csv 파일을 추출하고 연결합니다.물론이죠, 기쁘네요! 저는 여전히 JMP를 사용하여 전체 파일 목록을 검색한 다음 REGEX를 사용하여 을 포함하는 파일 이름을 검색할 수 있다는 점을 지적하려고 했습니다. 실제로 폴더가 1300개 이상이면 시간이 좀 걸릴 수 있을 것 같습니다.
속도에 대한 몇 가지 조언:
- 로그에 인쇄하면 속도가 느려집니다.
- 또한 각 파일을 연결하고 닫기 전에 먼저 모든 파일을 엽니다.
*Mac을 사용하는 경우 JMP에서 셸 스크립트를 시작할 수 있습니다. Windows에서는 Cygwin 등을 사용하지 않는 한 Powershell은 JMP에서 호출할 수 있는 유틸리티 프로시저를 작성하는 데 좋은 옵션입니다.
필
Re: 동일한 구조를 가진 폴더에서 csv 파일을 추출하고 연결합니다.안녕하세요 필,
귀하의 조언에 진심으로 감사드립니다! 그래도 나는 스크립트를 실행하지 않았습니다.
나는 소량의 폴더를 사용하여 시험해 보았고 나중에 JMP가 두 번째 디렉토리로 이동하여 *.csv 파일을 추출하는 등의 작업을 수행하므로 폴더의 양이 많으면(예: 1,300개 이상) 시간이 오래 걸린다는 것을 깨달았습니다. 소비하지만.
효율성을 높이기 위해 bash를 사용하여 모든 csv 파일을 폴더로 옮긴 다음 연결하는 방법을 생각했습니다. bash를 사용하여 1,300개 이상의 폴더로 이 작업(csv 파일 추출 및 연결)을 수행하는 빠른 검사에는 13MB의 연결된 csv 파일로 3초가 걸렸습니다!!! JSL 내에서 bash 명령을 실행할 수 있는 가능성을 조사해야 합니다.
그나저나,
dt = Open( dirpath || TheFileList,invisible );
처리 중에는 데이터 테이블이 팝업되지 않습니다.
다시 감사합니다!
Re: 동일한 구조를 가진 폴더에서 csv 파일을 추출하고 연결합니다.안녕 jyw ,
Jim의 제안 외에도 원하는 파일을 선택하기 위해 다음과 같은 일반화된 접근 방식을 시도해 볼 수 있습니다. 예를 들어 아래를 참조하세요.
allFiles = FilesInDirectory("$Documents", recursive);
selectedFiles = {};
commonName = "BrownP";
For( i = 1, i<=NItems(allFiles), i++,
If( !IsMissing( Regex(allFiles, EvalInsert(".*<COMMONNAME>.*\.csv","<",">" )) ),
InsertInto(selectedFiles, allFiles);
)
);</COMMONNAME>
1. 내 문서 폴더와 그 하위 폴더에 있는 모든 파일 이름을 검색합니다. (최상위 폴더 경로로 바꾸십시오).
2. 원하는 파일 이름을 저장할 빈 목록을 만듭니다.
3. commonName 문자열을 정의합니다.
4. 모든 파일 이름을 반복하면서 패턴과 일치하는 파일만 선택하고 선택된파일 목록. 이 예에서는 파일 이름에 "BrownP"가 포함된 모든 CSV 파일을 검색하고 있습니다. (자신의 commonName 문자열로 바꾸십시오).
따라서 전체 구현은 다음과 같습니다(이전 게시물의 Jim 코드 사용).
Names Default To Here( 1 );
// Setup an empty table to start to concatenate other tables to
dtbase = New Table( "Base Table" );
// Have the user select the starting folder
dirpath = Pick Directory( "Pick the Top Level Directory" );
// Get all of the files in all of the folders that are under the picked folder
TheFileList = Files In Directory( dirpath, "recursive" );
// Define common string to search for
commonName = "file";
// Go through all of the files and read in append those that meet your
// requirement. You will need to amend the IF statement to meet your criteria
For( i = 1, i <= N Items( TheFileList ), i++,
If( !Is Missing( Regex( TheFileList, Eval Insert( ".*<COMMONNAME>.*\.csv", "<", ">" ) ) ),
dt = Open( dirpath || TheFileList );
dtbase = dtbase << concatenate( dt, append to first table( 1 ) );
Close( dt, nosave );
)
);</COMMONNAME>
도움이 되었기를 바랍니다!
최상의,
필
Re: 동일한 구조를 가진 폴더에서 csv 파일을 추출하고 연결합니다.
Names Default To Here( 1 );
// Setup an empty table to start to concatenate other tables to
dtbase = New Table( "Base Table" );
// Have the user select the starting folder
dirpath = Pick Directory( "Pick the Top Level Directory" );
// Get all of the files in all of the folders that are under the picked folder
TheFileList = Files In Directory( dirpath, "recursive" );
// Go through all of the files and read in append those that meet your
// requirement. You will need to amend the IF statement to meet your criteria
For( i = 1, i <= N Items( TheFileList ), i++,
If( Uppercase( Word( -1, TheFileList[i], "." ) ) == "CSV" & Is File( dirpath || TheFileList[i] ) == 1,
If( Contains ( TheFileList[i], "<2nd folder common name"),
If( Contains (TheFileList[i],"<COMMON name="" of="" the="" csvfile="">"),
print(TheFileList[i]);
dt = Open( dirpath || TheFileList[i] );
dtbase = dtbase << concatenate( dt, append to first table( 1 ) );
Close( dt, nosave );
);
);
);
);</COMMON>
작동하려면 두 줄을 더 추가하세요. 하지만 정렬/들여쓰기를 조정해야 합니다.
감사합니다!
Re: 동일한 구조를 가진 폴더에서 csv 파일을 추출하고 연결합니다.예, 두 번째 레이어와 csv 파일 모두에 대한 "일반 이름"이 무엇인지 알고 있습니다. 감사합니다!
Re: 동일한 구조를 가진 폴더에서 csv 파일을 추출하고 연결합니다."일반 이름"이 무엇인지 미리 알고 계시나요?아니면 스크립트에서 이를 파악하도록 해야 합니까?이 경우 폴더에 공통 이름이 두 개 이상 있을 수 있나요?
Re: 동일한 구조를 가진 폴더에서 csv 파일을 추출하고 연결합니다.안녕하세요 짐,
작동하게 되었는데 모든 CSV 파일이 나열되어 있어서 두 번째 레이어를 정렬하거나 지정하는 방법을 찾으려고 합니다. 좀 더 팁을 주실 수 있나요?
감사합니다!
Re: 동일한 구조를 가진 폴더에서 csv 파일을 추출하고 연결합니다.다음은 좋은 시작을 제공하는 스크립트입니다.
Names Default To Here( 1 );
// Setup an empty table to start to concatenate other tables to
dtbase = New Table( "Base Table" );
// Have the user select the starting folder
dirpath = Pick Directory( "Pick the Top Level Directory" );
// Get all of the files in all of the folders that are under the picked folder
TheFileList = Files In Directory( dirpath, "recursive" );
// Go through all of the files and read in append those that meet your
// requirement. You will need to amend the IF statement to meet your criteria
For( i = 1, i <= N Items( TheFileList ), i++,
If( Uppercase( Word( -1, TheFileList[i], "." ) ) == "CSV" & Is File( dirpath || TheFileList[i] ) == 1,
dt = Open( dirpath || TheFileList[i] );
dtbase = dtbase << concatenate( dt, append to first table( 1 ) );
Close( dt, nosave );
);
);