2013-04-10 6 views
2

텍스트 파일에서 CSV를 구문 분석하는 데 문제가있어 도움을 줄 수 있는지 궁금합니다. 지금까지 필자는 다음을 가지고 있습니다.REXX - CSV 파일에서 구문 분석

CSV 파일 (DATA.txt)은 이와 같이 보입니다. 항상 15 개의 필드가 모두 쉼표로 구분됩니다. 일부 필드는 필수 필드가 아니므로 일부 필드는 채워지고 일부 필드는 비어 있습니다.

Seattle,Lastname,Firstname,DOB,SEX,etc,etc 
Seattle,Lastname,Firstname,DOB,,etc,etc 
Portland,Lastname,Firstname,DOB,SEX,,,etc 
Portland,Lastname,Firstname,DOB,SEX,etc,etc 

그리고 여기가 구문 분석 할 때 내가 ARG 또는 VAR을 이용해야하는지 잘 모르겠어요 내 REXX 코드

SOURCEFILE = "C:\DATA\DATA.TXT" 
IF A=2 THEN DO COUNTER=1 TO LINES(SOURCEFILE) 
    PARSE VALUE LINEIN(SOURCEFILE) WITH CITY "," LAST_NAME "," FIRST_NAME "," MOM_NAME "," MIDDLE_NAME "," DAD_NAME "," DOB "," etc "," etc "," etc "," etc "," SEX "," etc "," etc 
    CALL SETCURSOR 4,23 
    CALL CREATEDATA 
END 

CREATEDATA: 
CALL TYPE CITY 
CALL PRESS TAB 
CALL TYPE LAST_NAME 
CALL PRESS TAB 
CALL TYPE DATE(U) 
CALL PRESS TAB 
CALL TYPE FIRST_NAME 
CALL PRESS TAB 
CALL PRESS ENTER 
RETURN 

또는 내가 제대로 처음 두 행을 작성합니다. 나는 "CITY"를 파싱 된 값으로 입력했기 때문에 CREATEDATA 함수가 올바르게 작동한다는 것을 알고 있습니다. 어떤 도움이라도 대단히 감사 할 것입니다. 고맙습니다!

답변

1

몇 가지 의견 : 아마 전체 파일을 읽는 포함 Windows 시스템에서

1) Lines(SourceFile)는 CR-LF 시퀀스를 계산합니다. 그런 다음 Parse value LineIn(SourceFile) 루프가 다시 읽습니다. 이 작업을 수행하는 전형적인 REXX 방법은 다음과 같습니다

적어도
Address SYSTEM 'TYPE' SourceFile with output stem Lines. 
Do Counter = 1 to Lines.0 
    Parse var Lines.Counter ... 
End 
Drop Lines. 

, 한 파일이 너무 큰 아니므로 배열을 유지하는 메모리에 비용이 많이 드는입니다.

2) 루프가 끝날 때 CreateData으로 유입되므로 'CITY'가 표시됩니다. 그 End 지침 다음에 Return 또는 Exit이 필요합니다.

3) City이 초기화되지 않았기 때문에 (# Rexx의 초기화되지 않은 변수의 값은 대문자로 된 이름이기 때문에) # 2에 비추어 Parse이 절대 실행되지 않는다는 것이 분명합니다. A=2에 조건부로 사용하면 안됩니다. 경우

IF A=2 THEN DO COUNTER=1 TO LINES(SOURCEFILE) 

에서 다음의 경우 A = 2의 목적이 무엇인지

+0

Cowlishaw의 Rexx 서적에 따르면 LINES builtin 함수는 참조 된 파일의 줄 수를 반환하거나, 결정할 수없는 경우 0이 아닌 수의 '1'을 반환합니다. 적절하다면, 그렇지 않으면 '0'이다. 나는 윈도우즈에서 ooRexx를 꽤 많이 사용하며 ooRexx가 모든 라인을 계산하지 않는다는 것을 확인할 수있다. 단지 0/1을 반환한다. 한 번에 한 줄씩 파일을 읽으려면 다음을 사용하십시오. LINES (filename)> 0; PARSE VALUE LINEIN (파일 이름) ...; END – NealB

+0

'Lines()'의 결과는 구현에 따라 다릅니다. 일부 구현은 개수를 반환하고 다른 구현은 관찰 한대로 1 또는 0을 반환합니다. 또한 줄기를 위로 올리는 것을 선호하는 이유입니다.'Lines.0'은 실제 수입니다. –

1

한 질문! = 2 루프는 무시됩니다. 나는 당신의 프로그램이 있어야합니다 의심 :

SOURCEFILE = "C:\DATA\DATA.TXT" 
DO COUNTER=1 TO LINES(SOURCEFILE) 
    PARSE VALUE LINEIN(SOURCEFILE) WITH CITY "," LAST_NAME "," FIRST_NAME "," MOM_NAME "," MIDDLE_NAME "," DAD_NAME "," DOB "," etc "," etc "," etc "," etc "," SEX "," etc "," etc 
    CALL SETCURSOR 4,23 
    CALL CREATEDATA 
END 

RETURN /* prevent the fall through to createdata */ 

CREATEDATA: 




--------------------------- 

구문 분석 문은 다음과 같은 기본 형식

구문 분석 [출처] [분석 제어]

은 [소스]

인수를 icludes을 가지고 - 프로 시저 호출의 인수 pull - 데이터가 스택에서 제거되었습니다. var - 데이터는 변수 의 값입니다.데이터 공급 인라인으로

그래서 구문 분석은

linein = LINEIN(SOURCEFILE) 
    PARSE var linein CITY "," LAST_NAME "," FIRST_NAME "," MOM_NAME "," MIDDLE_NAME "," DAD_NAME "," DOB "," etc "," etc "," etc "," etc "," SEX "," etc "," etc 

또는

같이 할 수
DO COUNTER=1 TO LINES(SOURCEFILE) 
     CALL SETCURSOR 4,23 
     CALL CREATEDATA LINEIN(SOURCEFILE) 
    END 

    RETURN /* prevent the fall through to createdata */ 

    CREATEDATA: 
    parse arg CITY "," LAST_NAME "," FIRST_NAME "," MOM_NAME "," MIDDLE_NAME "," DAD_NAME "," DOB "," etc "," etc "," etc "," etc "," SEX "," etc "," etc 

마지막으로 로스가 전체 파일을 읽는 포함 당신이 시도하고 선 (SourceFile을)를 aviod해야한다고 말했다 엉덩이