Hi Community !I’d like to share a piece of code which might be useful for someone. It is called abap data parser. Its purpose is parsing of TAB-delimited text into an arbitrary flat structure or internal table. Why TAB-delimited? This is the format which is used automatically if you copy (clipboard) something from Excel – this creates some opportunities for good program usability.

So what does it do. Let’s say we have this data in a form of string (CRLF as a line delimiter, TAB as a field delimiter):

NAME     BIRTHDATE
ALEX     01.01.1990
JOHN     02.02.1995
LARA     03.03.2000

… and a corresponding data type and internal table.

types: begin of my_table_type,
         name      type char10,
         birthdate type datum,
       end of my_table_type.

data lt_container type my_table_type.

To parse the string into the container table just add the following code:

lcl_data_parser=>create( lt_container )->parse(
  exporting i_data      = lv_some_string_with_data
  importing e_container = lt_container ).

The class supports some additional features, in particular, “unstrict mode” which allow to skip field of the target structure in text – useful when you need to load just several certain fields of a huge data structure (like standard tables in SAP). Let’s consider our data type has additional field, unnecessary in the current context:

types: begin of my_table_type,
         name      type char10,
         city      type char40,   " << New field, but still just 2 in the text
         birthdate type datum,
       end of my_table_type.
...
lcl_data_parser=>create(
    i_pattern       = lt_container       
    i_amount_format = ' .'         " specify thousand and decimal delimiters
  )->parse(
    exporting
      i_data      = lv_some_string_with_data
      i_strict    = abap_false     " missing city field will not throw an error
      i_has_head  = abap_true      " headers in the first line of the text
    importing
      e_container = lt_container ).

Another feature: i_has_head parameter above means that the first line contains tech names of the fields – then the parser uses it to identify existing fields and their order (which may be flexible then).

Cases of usage

  • we (our company) use the code for some of our company’s products – like this one
  • we use it in the mockup loader – another our openly published tool for unit testing (actually the data parser was a part of mockup loader initially)
  • as a tool for mass uploads for some z-tables of some other our products

The code is free to use under MIT licence. Project home page is https://github.com/sbcgua/abap_data_parser

Installation can be done manually – just 1 include to to install – or with abapGit tool (the most convenient way).

I hope you find this useful ! =)

To report this post you need to login first.

7 Comments

You must be Logged on to comment or reply to a post.

    1. Alexander Tsybulsky Post author

      It should be 7.02. At least it was the target – I didn’t try honestly – all accessible systems had at least 7.31.

      Among comparably new feature it uses just string templates. But in case of incompatibilities please post an issue at github.

      (0) 
  1. Shai Sinai

    Thanks for sharing.

    It might be useful.

    I’ve reviewed the source code (Haven’t tried it yet) and I think that for the internal implementation of conversion from external value to internal value (method parse_field) you may use FM RS_CONV_EX_2_IN.

    (0) 
      1. Shai Sinai

        Do you mean Decimal notation?

        Well, you can always the preliminary conversion trick:

            CASE dcpfm.

              WHEN ”.

                TRANSLATE input USING ‘. ‘.

                TRANSLATE input USING ‘,.’.

              WHEN ‘Y’.

                TRANSLATE input USING ‘,.’.

              WHEN ‘X’.

                TRANSLATE input USING ‘, ‘.

            ENDCASE.

            CONDENSE input NO-GAPS.

        (0) 
        1. Alexander Tsybulsky Post author

          From what I saw this FM requires reference to real table/structure field which is not always dynamically available. I think I’ll stay with the current code – it is more flexible and allows completely custom structures. But anyway thanks for the tip =)

          (0) 
          1. Shai Sinai

            Your’e welcome.

            You are right. FM RS_CONV_EX_2_IN does require table/structure field, I’ve meant FM RS_CONV_EX_2_IN_NO_DD (From the same family 😆 ).

            (0) 

Leave a Reply