2017-12-10 20 views
1

입력 변수를 쉼표로 포트란 코드로 분할하려고합니다. 변수는 가변 날짜 수를 포함하는 문자열이지만 날짜는 항상 DD-MMM-YYYY 형식입니다.길이가 알려지지 않았지만 부분 문자열 형식이 쉼표로 구분 된 분할 포트란 문자열?

같은 문자열의 예 :

04-DEC-2015,10-DEC-2015,23-DEC-2015,25-DEC-2015 

그것은 항상 네 개의 날짜,하지만 항상 그 형식의 11 자로 된 날짜입니다.

이 날짜를 별도의 줄에 인쇄하기 만하면됩니다. 현재 코드 :

write(outfile,10) '  - ', TRIM(days) 

인쇄 :

 - 04-DEC-2015,10-DEC-2015,23-DEC-2015,25-DEC-2015 

내가 인쇄 뭔가 쓰고 싶은 :

 - '04-DEC-2015' 
    - '10-DEC-2015' 
    - '23-DEC-2015' 
    - '25-DEC-2015' 

이 할 수있는 간단한 방법 (I 꽤 새로운 해요이됩니다 Fortran으로)? 문자열의 쉼표 수를 계산하여 날짜 수를 얻으려면 1을 더하고 각 날짜에 맞는 CHARACTER(11) 변수를 만드는 루프 안에서 한 번에 문자열에서 11 문자를 가져 오는 것이 좋습니다 (쉼표 생략). 그 날짜를 원하는 형식으로 인쇄하십시오. 너무 복잡합니까?

답변

3

이전에 제안한 바와 같이, 내부 파일의 목록 지시어 읽기는 더 이상의 노력없이 쉼표로 분할을 처리합니다.

character(11) :: split_days(MAX_DAYS)='' 
ndays = ... 
read(days,*) split_days(1:ndays) 

에 대해서는 ndays 값을 알아야합니다. 당신이

ndays = (len_trim(days)+1)/12 
ndays = INDEX(days,',',BACK=.TRUE)/12+1 

또는

같은 행복 경우
ndays = COUNT([(days(i:i),i=1,LEN_DAYS)].eq.',')+1 

는 모든 것이 좋다.

양자 택일로, 당신은 아마 내가의 형태를 신뢰한다면 비록 당신이 내부 파일을 (리스트가 지시 또는 기타) 읽을 필요가 없습니다,

character(11), allocatable :: split_days(:) 
ndays = ... 
allocate (split_days(ndays)) 
read(days,*) split_days 

또는 할당 가능한 배열을 가질 수 내 입력 데이터.

do i=1,MAX_DAYS 
    split_days(i)=days(12*(i-1)+1:) 
    if (INDEX(days(12*i:),',').eq.0) exit 
end do 

목록 주도적 읽기 방법과 또 다른 가능성은 읽을 많은 수를 선택하고, 실패 할 경우, 적은 읽기 다시 시도하십시오. 이것은 더 까다로운 상황에서만 의미가 있습니다.

마지막으로 원하는 경우 축소/자르기 트릭을 사용할 수 있습니다.


만약 당신이있어 그냥 저장하지 않는, 인쇄 후, 위의 알 수없는 길이의 배열에 대해 장난 피한다 다음 루프 방식 :

do i=1,MAX_DAYS 
    print '("  - ''",A11,"''")', days(12*(i-1)+1:) 
    if (INDEX(days(12*i:),',').eq.0) exit 
end do 
나는이 라인을 따라 생각
+0

'read (days, *) split_days (1 : ndays)'<- 이것은 "severe (24) : read end file of read"오류를 해결합니다. 너무 작은 날짜 목록을 원래의 목적지가 너무 깁니다. (원래'read (days, *) split_days' 형식의). 감사. –

2

은 내부 읽기를 사용합니다.

character(len=47) :: in = '04-DEC-2015,10-DEC-2015,23-DEC-2015,25-DEC-2015' 
character(len=11) :: out(4) 
read(in,*)out 

메모는 쉼표로 구분됩니다. 쉼표 사이의 문자열이 11 자보다 많거나 적 으면 잘 리거나 공백으로 채 웁니다. 또한 문자열에 공백이 없거나 읽기가 너무 분할됩니다.

얼마나 많은 것을 읽어야하는지 알 필요가 있습니다. 길이가 모두 11이라는 것을 알고 있다면 (len(in)+1)/12을 수행하거나 index을 사용하여 쉼표를 계산하십시오.

+0

하지만, 수를 알 날짜는 다양합니다. 어쨌든 OP는 무언가를 계산해야합니다. 이 문제를 완전히 해소하려고 시도했을 때 원래 제안 된 OP 솔루션보다 복잡해졌습니다. –

+0

필자는 필 요한 배열 요소의 수를 세는 것을 의미했지만 올바른 길이로 배열 요소를 할당하면 결국 빈 줄을 피할 수 있습니다. –

+0

이것은 좋은 일이며, 일수를 안다면 작동합니다. 당신이 말했듯이, 캐릭터를 설정하면 (len = 11) :: out (4) 작동하지만 4를 변수로, p라고 말하고, 캐릭터 (len = 11)를 설정하려고하면 :: out (p)를 계산 한 후 p = (len (in) + q)/12, "A 명세서가 실행 섹션에 나타날 수 없습니다."라는 메시지가 나타납니다. 컴파일 할 때 오류가 발생했습니다. 누락 된 날짜 수를 계산 한 후 out *의 크기를 어떻게 설정할 수 있습니까? –