정리해야 할 csv 파일이 여러 개 있습니다.해당 파일에는 두 가지 기본 데이터 블록 구조가 있습니다.첫 번째 블록은 7개의 정보 행이 있는 1개의 열로 구성됩니다.두 번째 세그먼트에는 5개 이상의 데이터 행이 있는 6개의 열이 있습니다.
첫 번째 블록의 경우 이상적인 변환은 기둥을 두 조각으로 나누는 것입니다.한 조각은 열의 헤더 또는 이름을 제공합니다. 그리고 두 번째 부분은 특정 실험에 대한 데이터 정보를 제공합니다.
두 번째 블록은 최소한의 개입이 필요합니다.
지금까지 나는 몇 가지 잔소리를 제외하고는 원하는 상태에 가까워졌습니다.첫째, csv 파일을 두 조각(두 개의 테이블)으로 나누는 것은 문제가 되지 않습니다.첫 번째 데이터 테이블 –dt1-은 데이터가 추출되고 일부 행이 삭제되어 두 번째 데이터 테이블 –dt2가 생성되는 원본 csv 파일입니다.두 번째 데이터 테이블에는 7개의 행이 있는 1개의 열이 있습니다. 추가 치료가 필요한 것.
이를 위해 새 데이터 테이블 -dt3부터 시작합니다.For 루프를 사용하여 열 머리글을 만들고 목록의 첫 번째 요소를 가져오는 데 성공했습니다.이 정보는 dt2에서 가져옵니다.다음 부분은 저에게 문제를 주는 부분입니다.목록의 두 번째 요소를 dt3의 첫 번째 행으로 전달하거나 보내야 합니다.
첫 번째 질문:
다음 줄이 원래 데이터 테이블(dt1)에서 열 1의 첫 번째 셀을 변경할 수 있지만 다음 코드 조각이 새 데이터 테이블에서 작동하지 않는 이유는 무엇입니까?
dt1[1,1]=300; // 이것은 작동합니다
dt3[1,1]=300; //작동하지 않습니다.오류가 발생합니다.
'Assign' , dt3[1, 1] = /*###*/300 /*###*/의 액세스 또는 평가에서 잘못된 아래 첨자(숫자 또는 숫자 목록이어야 함)
두 번째 질문
:를 문자 식별자로 사용하여 처음 7개 행을 헤더 정보와 행 데이터로 구분합니다.이 접근 방식의 단점은 날짜/시간 행에 이러한 문자가 3개 있고 두 번째 찾은 후 데이터가 손실된다는 것입니다.이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까?
아이디어나 제안이 있으십니까? 첨부된 엑셀 파일은 데이터 테이블 예시입니다.
도움을 주셔서 감사합니다.
원본 csv 파일의 예
음식 레시피: 1-걸쭉한 소스 | | | |
블렌더 레시피: 3단 속도 | | | |
온도 레시피: 100 증기 | | | |
요리 하드웨어: 스테인레스 | | | |
배치 ID: Mini-Cake-100 | | | |
샘플 ID: Mini-Cake-100.1 | | |
날짜/시간: 2017년 6월 30일 오후 4:12:44 | | |
| | | | | |
| | | | | |
가리키다 | 밀도 | 설탕 | 비율 | 엑스 | 와이 |
1 | 5020.607 | 98.6872 | 0.9976 | 145 | 0 |
2 | 4976.009 | 98.1275 | 0.9955 | 108.75 | 0 |
삼 | 4977.177 | 98.3677 | 0.9958 | 72.5 | 0 |
4 | 4982.821 | 98.2569 | 0.9957 | 36.25 | 0 |
5 | 4989.282 | 98.2105 | 0.9977 | 0 | 0 |
데이터 테이블 2(dt2)의 예. 7개의 행이 있는 1개의 열. :는 열 이름을 실험 정보와 구분합니다.
음식 레시피: 1-걸쭉한 소스 |
블렌더 레시피: 3단 속도 |
온도 레시피: 100 증기 |
요리 하드웨어: 스테인레스 |
배치 ID: Mini-Cake-100 |
샘플 ID: Mini-Cake-100.1 |
날짜/시간: 2017년 6월 30일 오후 4:12:44 |
dt2의 원하는 변환.
음식 레시피 | 블렌더 레시피 | 온도 레시피 | 요리 도구 | 배치 ID | 샘플 ID | 날짜 시간 |
1-진한 소스 | 3단 속도 | 100 증기 | 스테인리스 | 미니케이크-100 | 미니케이크-100.1 | ######### |
JSL 코드
<BR />
Names Default To Here( 1 );
Close All(data tables);
Clear Log();
Clear Symbols();
Close All(Journals, No Save);
//***********************************************************************************************************************************************************
/*Open collected data from a share drive
and assign working data table(s) -->dt1
*/
dt1 = Open(
"C:\Users\...................filename.csv",
columns(
Column( "c000001", Character, "Nominal" ),
Column( "c000002", Character, "Nominal" ),
Column( "c000003", Character, "Nominal" ),
Column( "c000004", Character, "Nominal" ),
Column( "c000005", Character, "Nominal" ),
Column( "c000006", Character, "Nominal" )
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Comma, 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" )
)
);
//The raw data table repeats information every 48 rows
//This table separates each item into individual tables
//The generated table does not have formated column headings
//For(i=1, i <=x, i++, //this For loop is ignored for now until dt2 --> dt problem is solved
selrows =dt1 <<SELECT rows=""></SELECT>
첫 번째 문제는 dt3 데이터 테이블에 행이 없다는 것입니다. 추가하면
dt3 << add rows(N Rows( dt2 ));
dt3을 만든 직후에 해당 테이블을 채울 수 있습니다.
두 번째 문제는 원하는 것이 문자열의 두 번째 단어가 아니라 첫 번째 ":" 다음의 모든 항목이라는 것입니다. 따라서 Substr() 함수를 사용하면 더 잘 작동합니다.
dt3[iii, 1] = Trim Whitespace( substr(Column( dt2, 1 )[iii], contains(column( dt2, 1 ), ":") ) )