一、文件的打开(OPEN DATASET)

       OPEN DATASET dset FOR access IN mode [position] [os_additions] [error_handling]

 使用存储模式mode,访问方式access打开dset指定的文件,文件必须在当前程序被打开,否则会产生操作异常。条件positions,os_addition和error_handling决定文件打开的位置,指定特定平台条件,和异常处理。

二、文件内容的写入(TRANSFER)

      TRANSFER dobj TO dset [LENGTH len] [NO END OF LINE]

    从当前文件指针开始将数据对象dobj的内容写入dset指定的文件。在数据写入后,文件指针设置到插入的数据后面,可以使用LENGTH限制传递的字符或者字节数量。

三、文件内容的读取(READ DATASET)

      READ DATASET dset INTO dobj [MAXIMUM LENGTH mlen]  [[ACTUAL] LENGTH len]

       从dset指定的文件将数据读到数据对象dobj。内容从当前文件指针读,文件指针设置到读取数据之后。MAXIMUM LENGTH可以限制将要从文件读取的字符或者字节的数量,ACTUAL LENGTH代表实际使用的字符或和字节的数量。

四、文件指针,文件属性的读取和设置(GET DATASET,SET DATASET)

这两个语句的两个条件至少指定一个,并且操作前文件必须被打开。

GET DATASET dset [POSITION pos] [ATTRIBUTES attr]:POSITION得到文件指针在dset中指定的文件的位置。ATTRIBUTES 获取文件附加的属性。

        SET DATASET dset [POSITION {pos|{END OF FILE}}]  [ATTRIBUTES attr]:POSITION设置文件指针在dset中指定的文件的位置,ATTRIBUTES 设置文件附加的属性。

五、截取文件内容(TRUNCATE DATASET)

TRUNCATE DATASET dset AT {CURRENT POSITION}|{POSITION pos}

CURRENT POSITION:这个语句设置在dset中指定的文件的结尾为AT后指定的值,因此可以改变文件的大小。当缩小,在文件新的结尾文件被缩减;当扩展,文件从之前到新的文件结尾用十六进制0被填充,语句返回sy-subrc总是为0或者产生一个异常。

六、文件的关闭和删除(CLOSE DATASET,DELETE DATASET)

        CLOSE DATASET dset:关闭dset指定的文件,如果文件已经被关闭或者不存在,语句会忽略并且返回sy-subrc为0。如果在写入文件之前操作系统缓存了数据并且在缓存中仍旧有数据,在关闭文件前这个数据会被写入文件。如果被打开的文件不显式的使用CLOSE DATASET关闭,当程序结束的时候文件自动被关闭。

        DELETE DATASET dset:删除dset指定的文件,当文件被删除,自动授权检查被执行;自编程检查同样是必要的。sy-subrc为0,文件被删除,4:文件不能被删除;

 


 一 .OPEN DATASET dset FOR access IN mode [position] [os_additions] [error_handling]

        通常来说在一个内部会话中最多可以打开100个文件。实际上同时打开的文件的数量要少,这个取决于平台,当打开一个文件时,首先会进行自动授权检查 ,有时候自编程的检验也是必要的。

代码示例:

DATA: file TYPE string VALUE 'test.dat',
      pos  TYPE i,
      text TYPE string.
 
""FOR OUTPUT:用于写,如果文件已经存在,内容会被删除,如果文件不存在,则创建,允许读
OPEN DATASET file FOR OUTPUT IN TEXT MODE
                             ENCODING DEFAULT
                             WITH SMART LINEFEED.
""将内容写到文件结尾  此时文件指针在文件末尾
TRANSFER '1234567890' TO file.""此时position为11:从0开始,行结束符为10,指针指向末尾11
GET DATASET file POSITION pos.""获得pos为11
READ DATASET file INTO text.""text为空,由于会从当前位置向后读,也就是位置11之后
 
SET DATASET file POSITION 1.""将文件指针指向位置1
READ DATASET file INTO text.""text为234567890
 
TRANSFER 'ABCDEFGHIJ' TO file.""注意:text:1234567890结束符ABCDEFGHIJ
CLOSE DATASET file.
 
""FORM INPUT:用于读 默认文件指针在文件开始
OPEN DATASET file FOR INPUT IN TEXT MODE
                            ENCODING DEFAULT
                            WITH SMART LINEFEED.
READ DATASET file INTO text.""注意:text:1234567890,由于读到结束符中止
 
SET DATASET file POSITION 11.""将文件指针指向位置11
READ DATASET file INTO text.""ABCDEFGHIJ
CLOSE DATASET file.

附加参数

(一)访问类型

  access:用来指定以读,写,附加或者修改的方式打开文件。在Unicode程序,指定访问类型是必须的。

  1. INPUT
  • 用于读,默认文件指针指向了文件的开始。在Unicode程序,对于读方式打开的文件写访问是不行得。在非Unicode程序写权限也是可以的。
  • OUTPUT
  • 用于写。如果特定文件已经都存在,内容会被删除。如果特定的文件不存在则创建,允许读访问。

     3.APPENDING

  • 附加。如果特定文件已经存在,打开文件会把文件指针设置到的文件的最后。如果特定的文件不存在,则创建创建。企图使用语句READ DATASET用FOR APPENDING条件对文件进行读访问会失败,sy-subrc为4。

        4.UPDATE

  • 打开文件对已经存在的内容进行修改。默认文件指针设置到文件的开始。

(二)访问模式

mode:定义对文件的操作时作为二进制文件还是文本文件。在非Unicode系统,LEGACY条件可以指定byte order或者code page。

    1.BINARY MODE:作为二进制打开文件

    2.TEXT MODE encoding [linefeed]

  • 作为文本文件打开,条件ENCODING定义了在文本文件字符怎么表现。当写到一个文本文件,数据对象的内容会被转换到ENCODING指定的表现,如果数据类型是字符的并且是flat的,任何后续的空格被删减。在数据类型string,后续的空格不会被删除。当从一个文本文件读取数据的时候,文件会被一直读直到下一个行尾,从ENCODING指定的格式转化为当前的字符格式,传递到数据对象,行尾选择通过条件linefeed控制。 
  • 在Unicode程序,只有字符类型的数据对象可以被传递到文本文件,或者从文本文件读。在Unicode程序条件encoding必须被指定,在非Unicode程序可以被省略。

   3.LEGACY BINARY MODE [{BIG|LITTLE} ENDIAN] [CODE PAGE cp]

  • 打开一个legacy文件,条件IN LEGACY BINARY MODE以legacy二进制文件的形式打开文件,BIG|LITTLE ENDIAN可以被用来指定字节序列并且CODE PAGE可以用来指定操作文件内容的code page。
  • {BIG|LITTLE} ENDIAN:这个条件指定了类型i,decfloat16,decfloat34,f或者s的数据对象的值以 大端或者小端的字节序列存储到文件。当这些类型的数据对象被写或者读,这些序列之间的转换和当前平台的序列被处理。SET DATASET语句可以用来给打开的legacy 文件指定不同的字节序列。
  • CODE PAGE cp:指定了类字符的数据对象基于cp在文件的表示。在Unicode系统,文件中的字符在非Unicode系统被操作,读或者写数据的时候会被分配(就如当前文本环境中数据库表TCP0C中条目指定的)。当语句被执行的时候,cp来自数据库表TCP00列CPCODEPAGE的非Uincode的页。
  • 在Unicode系统,当读写文件的时候这个条件允许文件内容到当前字符格式的自动转换。
  • 对于一个打开的legacy文件语句SET DATASET可以被用来指定不同的code page。

     4.LEGACY BINARY MODE [{BIG|LITTLE} ENDIAN] [CODE PAGE cp] [linefeed]

  • 打开一个legacy文件,条件IN LEGACY TEXT MODE指定以文本文件的形式打开文件。在这种情形,同legacy二进制文件,其余条件同上,

(三)位置

position:根据字节的数量设置文件指针到指定的位置pos。文件开始的位置为0,如果pos包含-1,位置指定的是文件末尾。条件POSITION不能够在条件FILTER或者BYTE-ORDER MARK指定的同时指定。

对以下情形进行说明:

  1. 如果文件以读的意图打开并且pos大于文件的长度,文件指针会指向文件外面,读不到数据。通过非Unicode程序以读的方式打开文件进行修改,文件会被从十六进制的0到指定的位置进行padded,写会从这个位置之后进行。
  2. 如果文件为附加,位置的指定会被忽略并且文件的指针会被设置到文件的结尾。
  3. 如果文件为了修改,pos的值大于文件的长度,下一次的文件写入,会从十六进制的0到文件指定的位置,在那之后新的内容会被写入。

说明:

  • 对于大于2GB,i类型的pos对于整个文件的指定是不够的,必须用p或者decfloat取代。
  • 位置可以被SET DATASET重写。在特殊情况下,为了将指针指向文件结尾,SET DATASET指定pos为-1。

二、TRANSFER dobj TO dset [LENGTH len] [NO END OF LINE]

LENGTH len:这个条件决定了数据对象dobj有多少字符或者字节被写到文件。如果条件LENGTH没有被指定,所有的字节或者字符被写入。

如果len小于或者等于0,没有字符或者字节被写入。如果len大于dobj字符或者字节数,空白或者十六进制0会被传递到文件替代缺失的字符或者字节,这个取决于文件是作为(legacy)文本文件还是(legacy)二进制文件。

NO END OF LINE:写入数据时候不写入行结束符号

代码示例:

        从数据库表SPFLI查询的数据转化为二进制然后写入到文件flights.dat。使用一个类型字段符号<hex_container>访问结构中的二进制内容,为了达到同样的结果,可以直接传递结构wa,推荐使用字段符号,由于这样明确传递二进制数据到二进制文件。这个存储的类型只推荐短期的存储在同样的系统,由于字节类型的内容依赖字节序和当前的代码页。对长期的存储或者在系统间交换,数据应该转化成字符容器并且存储为文本文件。

DATA: file TYPE string VALUE `flights.dat`,
      wa   TYPE spfli.
FIELD-SYMBOLS <hex_container> TYPE x.
OPEN DATASET file FOR OUTPUT IN BINARY MODE.
SELECT * FROM spfli  INTO wa.
  ASSIGN wa TO <hex_container> CASTING.
  TRANSFER <hex_container> TO file.
ENDSELECT.
CLOSE DATASET file.

三、READ DATASET dset INTO dobj [MAXIMUM LENGTH mlen]  [[ACTUAL] LENGTH len]

        来自文本文件的数据应该只读到字符类型的数据对象,来自二进制的文件应该只读到字节类型的数据对象。推荐导出这些到二进制容器并且使用ASSIGN语句CASTING条件分配这些根据赋予的字段符号类型。

代码示例:

    通过上面TRANSFER例子中写入二进制文件flights.dat的数据,数据被写入字节类型的字段符号<hex_container>。使用结构化的工作区分配到字段符号,比起直接导入到结构wa更推荐使用字段符号处理。原因是用这种方式,数据显式的从二进制文件传输到二进制数据数据类型。

DATA: file TYPE string VALUE `flights.dat`,
          wa   TYPE spfli.
FIELD-SYMBOLS <hex_container> TYPE x.
OPEN DATASET file FOR INPUT IN BINARY MODE.
ASSIGN wa TO <hex_container> CASTING.
DO.
  READ DATASET file INTO <hex_container>.
  IF sy-subrc = 0.
    WRITE: / wa-carrid,wa-connid,wa-countryfr,wa-cityfrom,wa-cityto,wa-fltime,wa-distance.
  ELSE.
    EXIT.
  ENDIF.
ENDDO.
CLOSE DATASET file.

 

运行结果:

abap 数据分析 abap open dataset_文本文件

 

 MAXIMUM LENGTH mlen:决定了最多多少字符或多少字节会从文件读入。在文本文件,mlen的内容决定了有多少字符可以从文件读入。在二进制文件或者legacy文本文件和legacy二进制文件,mlen决定了多少字节从文件读取,在文本文件的情形,读取的字节数量依赖使用ENCODING打开文件的字符的格式。

代码示例:

        数据被导入一个不是字节类型的字段符号,而是一个字节类型的数据对象hex_container,被导入的字节数量取决于赋型的字段符号<spfli>,这个符号用来在每个循环处理导入的数据组件(一个一个的组件处理)。

DATA: file TYPE string VALUE `flights.dat`,
      hex_container TYPE x LENGTH 1000,
      len TYPE i.
FIELD-SYMBOLS <spfli> TYPE spfli.
DESCRIBE FIELD <spfli> LENGTH len IN BYTE MODE.
OPEN DATASET file FOR INPUT IN BINARY MODE.
ASSIGN hex_container TO <spfli> CASTING.
DO.
  READ DATASET file INTO hex_container MAXIMUM LENGTH len.
  IF sy-subrc = 0.
    WRITE: / <spfli>-carrid,
             <spfli>-connid,
             <spfli>-countryfr,
             <spfli>-cityfrom,
             <spfli>-cityto,
             <spfli>-fltime,
             <spfli>-distance.
  ELSE.
    EXIT.
  ENDIF.
ENDDO.
CLOSE DATASET file.

[ACTUAL] LENGTH alen:从文件读取的字节或者字符的数量到数据对象。对于文本文件,系统决定有多少字符被写入内存区域。对于二进制文件,legacy文本文件和legacy二进制文件,系统决定了有多少字节从文件读入。

四、GET DATASET dset [POSITION pos] [ATTRIBUTES attr]

    如果没有条件被指定,语句可以利用TRY控制结构来判断文件是否被打开。

代码示例:

        这个条件传递属性到数据对象attr,attr的数据类型必须是dset_attributes,这个在类型组DEST定义,dset_attributes有两个子结构:fixed和changeable。子结构fixed的组件记录了不能使用SET DATASET语句改变的文件的属性,子结构changeable的组件记录了可以使用SET DATASET语句改变的文件的属性。

 

DATA: file TYPE string VALUE 'test.dat',
      pos  TYPE i,
      text TYPE string.
OPEN DATASET file FOR OUTPUT IN TEXT MODE
                             ENCODING DEFAULT
                             WITH SMART LINEFEED.
TRANSFER '1234567890' TO file.
GET DATASET file POSITION pos.
TRANSFER 'ABCDEFGHIJ' TO file.
CLOSE DATASET file.
OPEN DATASET file FOR INPUT IN TEXT MODE
                            ENCODING DEFAULT
                            WITH SMART LINEFEED
                            AT POSITION pos.
READ DATASET file INTO text.
CLOSE DATASET file.

 

    决定的属性不能代表操作系统中打开的文件,而是用ABAP中打开文件的属性。

    例如:在这个例子,系统首先检查是否是用条件FILTER打开的test.dat文件。如果不是,当前的文件位置使用语句GET DATASET决定。

DATA: dset TYPE string VALUE 'test.dat',
      attr TYPE dset_attributes,
      pos TYPE i.
OPEN DATASET dset FOR INPUT IN BINARY MODE
                  FILTER 'uncompress'.
 
GET DATASET dset ATTRIBUTES attr.
IF attr-fixed-indicator-filter <> 'X'.
  GET DATASET dset POSITION pos.
ELSE.
ENDIF.
CLOSE DATASET dset.

 

 SET DATASET dset [POSITION {pos|{END OF FILE}}]  [ATTRIBUTES attr]:

        当写入的时候,从文件的开始读直到第一个文件结尾标识,然后一个新的内容被从文件结尾写入。如果数据的指针在读取之后不显式指定,最后一个TRANSFER语句会重写额外那件在第一个文件结束符号后。

示例代码:

DATA: file TYPE string VALUE 'test1.dat',
      pos  TYPE i,
      text TYPE string.
OPEN DATASET file FOR OUTPUT IN TEXT MODE
                             ENCODING DEFAULT
                             WITH SMART LINEFEED.
TRANSFER: 'Line1' TO file,
          'Line2' TO file,
          'Line3' TO file.
 
SET DATASET file POSITION 0.
READ DATASET file INTO text.""Line1
SET DATASET file POSITION END OF FILE.
READ DATASET file INTO text.""空
 
SET DATASET file POSITION 6.
READ DATASET file INTO text.""Line2
READ DATASET file INTO text.""Line3
SET DATASET file POSITION END OF FILE.
 
TRANSFER: 'Line4' TO file,
          'Line5' TO file,
          'Line6' TO file.
SET DATASET file POSITION 18.
READ DATASET file INTO text.""Line4
READ DATASET file INTO text.""Line5
READ DATASET file INTO text.""Line6
CLOSE DATASET file.

 

ATTRIBUTES  attr:当用语句OPEN DATASET打开文件,这个条件可以用来改变一些文件的属性。同样可修改的属性不会影响到操作系统上文件的属性,只会影响ABAP中打开的文件属性,影响取决于ABAP怎么操作。

示例代码:

根据文件test.dat不可修改的属性,一些能够修改的属性被改变。

DATA: dset TYPE string VALUE 'test.dat',
      attr TYPE dset_attributes.
 
OPEN DATASET dset FOR INPUT IN LEGACY TEXT MODE
                            WITH NATIVE LINEFEED.
 
GET DATASET dset ATTRIBUTES attr.
IF attr-fixed-mode = 'T' OR attr-fixed-mode = 'LT'.
  CLEAR attr-changeable.
  attr-changeable-indicator-conv_errors = 'X'.
  attr-changeable-conv_errors = 'I'.
  attr-changeable-indicator-linefeed_mode = 'X'.
  attr-changeable-linefeed_mode = 'S'.
  IF attr-fixed-mode = 'LT'.
    attr-changeable-indicator-code_page = 'X'.
    attr-changeable-code_page = '1100'.
  ENDIF.
  SET DATASET dset ATTRIBUTES attr-changeable.
ENDIF.
CLOSE DATASET dset.

 

五.TRUNCATE DATASET dset AT {CURRENT POSITION}|{POSITION pos}

truncate语句不改变当前文件的指针。

CURRENT POSITION:设置文件结尾到当前文件指针。

POSITION pos:设置文件结尾到pos指定的位置。文件的开始默认是位置0。

示例代码:

DATA: name TYPE string VALUE `test.dat`,
      hex  TYPE xstring.
hex = 'ABCD'.
data pos type i.
OPEN DATASET name FOR OUTPUT in BINARY MODE .
 
TRANSFER hex TO name.
SET DATASET name POSITION 0.
READ DATASET name INTO hex. ""ABCD
 
get DATASET name POSITION pos. ""2
TRUNCATE DATASET name AT POSITION 1.""缩减
SET DATASET name POSITION 0.
READ DATASET name INTO hex.""AB
 
get DATASET name POSITION pos.""1
TRUNCATE DATASET name AT POSITION 2.""扩展
SET DATASET name POSITION 0.
READ DATASET name INTO hex.""AB00
 
get DATASET name POSITION pos.""2
TRUNCATE DATASET name AT POSITION 3.""扩展
SET DATASET name POSITION 0.
READ DATASET name INTO hex.""AB0000
 
get DATASET name POSITION pos.""3
TRUNCATE DATASET name AT POSITION 4."扩展
SET DATASET name POSITION 0.
READ DATASET name INTO hex.""AB000000
 
CLOSE DATASET name.