안녕하세요
서버의 특정 디렉토리에 외부에서 Interface된 파일(2009-12-14.LOG)을 읽어서 sap table에 옮기려고 하고 있습니다.
물론 2009-12-14.LOG에는 약 13개 정도의 필드가 있고 tab으로 구분되어져 저장되어있습니다.
open dataset p_file for input in text mode encoding default.
do.
read dataset p_file into gt_exgtab.
if sy-subrc ne 0 .
exit.
endif.
append gt_exgtab. clear gt_exgtab.
enddo.
이러한 방법으로 p_file의 정보를 Itab으로 옮기겨고 하는데요..
분명히 LOG파일은 tab으로 구분되어져 있는데도 불고하고.
Internal table에 아래와 같이 #구분자가 붙여서 자리수를 차지하네요..
DATA : BEGIN OF gt_exgtab OCCURS 0,
ratedate LIKE sy-datum,
fcode(3) TYPE c,
active(1) TYPE c,
name(40) TYPE c,
rate(38) TYPE c,
directrate(38) TYPE c,
dollarrate(18) TYPE c,
baserate(18) TYPE c,
commt(200) TYPE c,
updateat LIKE sy-datum,
cratedby(20) TYPE c,
basecode(3) TYPE c,
basename(20) TYPE c,
END OF gt_exgtab.
RateDate
#Co
d
e#CurrencyisActive#Name#Rate#DirectRate#
DollarRate#BaseRate#Comment#Updated At
#Created By#Basecode#BaseName
원래는 RateDate Code CurrencyisActive Name Rate DirectRate DollarRate BaseRate Comment Updateed At Created By Basecode BaseName의 값이 각 Internal table의 필드에 Upload가 되어야 합니다.
do.
enddo.에서 읽은 file의 정보를 Internal table에 정확히 Upload하는방법이 무엇입니까??
댓글 6
-
TT
2009.12.14 18:23
-
Jon
2009.12.14 18:33
선언된 변수 길이만큼 짤려서 들어가는걸로 보이네요.
파일 생성할때 선언된 길이만큼 space를 넣던가, split 하시던가 ,, 여러 방법으로 구분 할 수 있습니다.
-
요요
2009.12.14 18:49
아마도 저 탭은 cl_abap_char_utilities=>vertical_tab 일 것 같네요.
split 구분자로 주시고 split 하시면 될 것 같습니다.
-
찬호사랑
2009.12.14 19:31
서버의 파일을 읽으면 아래와 같이 # 구분자가 들어가네요.
RateDate#Code#CurrencyisActive#Name#Rate#DirectRate#DollarRate#BaseRate#Comment#Updated At#Created By#Basecode#BaseName
이 데이터를 그냥 Split구문으로 # 구분자로 나누어서 데이터를 넣어주려고 하는데요..ㅎㅎ
OPEN DATASET p_file FOR INPUT IN TEXT MODE ENCODING DEFAULT.
DO.
CHECK sy-index > 1.
READ DATASET p_file INTO l_text.
IF sy-subrc = 0.
CLEAR lt_text. REFRESH lt_text.
SPLIT l_text AT '#' INTO : l_str1 l_str2 l_str3
l_str4 l_str5 l_str6
l_str7 l_str8 l_str9
l_str10 l_str11 l_str12 l_str13 ,
TABLE lt_text
IN CHARACTER MODE.
split l_text at '#' into : l_str1 l_str2 l_str3등을 짤라고 짤리지가 않고 l_str1 필드에다가 다 들어가네요.
휴~~이런 경우는 첨이네요..ㅎㅎ.
어찌해야합니까??
-
Jon
2009.12.14 19:58
혹시 해당 텍스트 파일에 # 글자가 없는지요?
엔터의 의미로 라인구분자로 들어 있을 것 같기도 합니다.
라인 구분자라면, 파일 생성시 선언된 변수만큰 스페이스 바를 넣어주는 방법이 좋을것 같습니다.
-
쭌수야~!
2009.12.14 20:18
파일을 읽었을때 보여는 문자 '#' 이 그냥 char '#' 이 아니라,
엑셀에서 데이터를 복사하여 에디터등에 붙여넣을때 들어가는 셀 구분 tab 이나, 엔터값 같은 특수값일듯 합니다.
요요님 말씀처럼,
위 소스에서 SPLIT l_text AT '#' ... 이 부분에서 구분자로 '#' 이 아니라 cl_abap_char_utilities=>vertical_tab 을 넣어서 해보시고,
그도 잘 되지 않으시면.... 흠...
read dataset 을 할때 최종 인터널테이블에 바로 넣지 마시고,
'#'에 해당하는 문자를 읽었을때 자리수가 얼마나 되는지 확인하신 후,
스트럭쳐를 하나 선언하셔서
DATA : BEGIN OF gs_exgtab,
ratedate LIKE sy-datum,
sharp1(1),
fcode(3) TYPE c,
sharp2(1),
active(1) TYPE c,
sharp3(1),
.
.
.
위와 같이 필드 사이 사이에 sharp1 등과 같이 쓰레가 값이 담길 공간을 잡아서 스트럭쳐로 read dataset 하신후
최종 인터널테이블에 옮겨 담는 법도 있을듯합니다.
테스트를 해보지 못하여 확실한 방법이라고는 말씀못드리겠네요. ^^;;;;
안녕하세요.
코딩보니깐,, do 문 안에서 split으로 짤라주셔야..되지않나요?