理解CSV文件以及ABAP中的相关操作

本文详细介绍了CSV文件的基本概念,包括Separator、Delimiter和Terminator的作用,同时提供了几种在ABAP环境中处理CSV文件的方法及其优缺点比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在很多ABAP开发中,我们使用CSV文件,有时候,关于CSV文件本身的一些问题使人迷惑。它仅仅是一种被逗号分割的文本文档吗?

  让我们先来看看接下来可能要处理的几个相关组件的词汇的语义。

  Separator:两个字段之间的界线,在CSV文件中即是“,”。

  Delimiter:这种符号的开端和结束,代表了某种东西的界限。举个例子“测试字符串”有两个delimiters,即两个双引号。在文本中包含很多逗号的情形下,CSV文件会使用双引号作为Delimiter.

  Terminator : 代表片段的结束。在CSV文件中,我们可以把换行看成terminator.

  如果我们不确定逗号或者双引号是否被允许在数据内出现,请看CSV的说明书:

  假如你想看CSV的全部标准的话,这里是CSV的实际标准

      http://tools.ietf.org/html/rfc4180

CSV格式的定义

  1,  每条记录位于单独的行上,由换行符分隔。

  2,  最后一条记录的换行符可有可无。

  3,  文件的第一行可以有一个可选的头部,其格式与普通行相同。

  4,  在头部和每条记录中,可以存在一个或多个字段,由逗号分割。整个文件中的每行应当包含同样数量的字段。空格被视为字段的一部分,不会被忽略。记录的最后一个字段的后面不可以存在逗号。

  5,  每个字段可以被双引号包围,也可以不这样做。(然而在某些程序中,比如Microsoft Excel, 完全不使用双引号)。如果字段没有被双引号包围,那么双引号不会在字段内部出现。

  6,  字段在包含换行符、双引号和逗号的情况下应当被双引号包围。

  7,  如果双引号被用作包围字段,而字段内部出现的双引号需要通过使用另一对双引号将其包围的方式转义处理。

在我的经验中,第七点是最容易被坑的地方。CSV作为由逗号分隔的值,给人带来了一种印象即逗号是separator并且给出的excel中不含逗号,这样容易造成混淆。

  那么看几个例子:

  基本例子:

  10, Vikas , Sydney

      数据内部有separator / delimiter的:

     "11", "Vikas", "Sydney, AU"      <-- 数据中包含逗号

     "12", "Vikas", "Sydney, "NSW" AU"   <-- 数据包含逗号和双引号

ABAP中的相关操作

  假设我们读取一个文件,这个文件可以从用户的桌面上传或者从服务器端读取。

1)   写下你的代码

  这个在一开始很简单,但随着时间的进行,它可能变得复杂。

  以字符串格式获取数据,使用逗号分割他们:

split lv_data at ',' into lw_struct-test1 lw_struct-test2 lw_struct-test3.

  缺点:

  a) 如果我们的数据中有separator, terminator 或者delimiter,这个就不管用了。(也就是说需要数据中不存在逗号、双引号或者换行符)

  b)  一旦格式改变,代码必须随之更新——意思是如果我们增加了一个新的字段test4,那么代码就要变为:

split lv_data at ',' into lw_struct-test1 lw_struct-test2 lw_struct-test3 lw_struct-test4.

2)   使用KCD_CSV_FILE_TO_INTERN_CONVERT读取文件

CALL FUNCTION 'KCD_CSV_FILE_TO_INTERN_CONVERT'
  EXPORTING
    i_filename      = 'C:\Temp\Upload.csv'
    i_separator     = ','
  TABLES
    e_intern        = gt_intern
  EXCEPTIONS
    upload_csv      = 1
    upload_filetype = 2.

  缺点:

  a) 文件只能从表示服务器/桌面中读取。注:有关表示服务器(Presentation Server)的内容,请参考SAP系统架构的相关内容

  b) 如果CSV文件中存在双引号,最后一个字段会保留双引号。(待验证)

  c) 在文件从服务端读取的情况下,我们需要阅读这个函数的内部代码,并且写一些自定义的逻辑。

3)   通过函数模块 RSDS_CONVERT_CSV使用RTTI和动态编程

  这是一个有效的办法,但是包含了大量的代码。你可以看看这个GIST中的代码:

      CSV_Upload_long_process

  总的来说步骤是这样的:

  ——使用RTTI获得目的表的结构

  ——使创建field catalog

  ——根据field catalog创建动态内表

  ——使处理原始CSV数据

  ——使将CSV数据存储在动态内表中

  缺点:

  a) 长代码所具有的缺点,特别是在你打算从零开始编写它的情况下。

  优点:

  a) 代码从目标表的格式中解放了。如果一个新的字段被添加,只需要从z_data_tty中更新表类型。

4)   使用类CL_RSDA_CSV_CONVERTER

   可以很直接地调用它——使用separator 和delimiter初始化类。对于一个普通的CSV文件,使用默认参数。

* Instantiate the CSV object
 
  call method cl_rsda_csv_converter=>create
*  EXPORTING
*    i_delimiter = C_DEFAULT_DELIMITER
*    i_separator = C_DEFAULT_SEPARATOR
    receiving
      r_r_conv    = lo_csv
 
* Process records
  loop at lt_upload_data into lv_data.
    CALL METHOD lo_csv->csv_to_structure
      EXPORTING
        i_data   = lv_data
      IMPORTING
        e_s_data = lw_struct.
endloop.

  就是这样!

  优点:

  a) 代码量很小——相比上面的第三种方案,减少了我们犯错的机会。

  b) 代码与文件结构无关——我们保持了上面方案的优点。

  c) 无论是应用服务器,还是表示服务器,它都适用——当然在这之前我们必须读取文件。

  d) 开发者已经在方法CSV_TO_STRUCTURE中为例子写下了详尽的文档。要大大地感谢他/她!

  e) 它是RSDA包的一部分,RSDA包目前在ABAP实验环境中同样存在,比如NSP。

如果你懒得键入全部程序,这里有全部源代码:

         CSV_Reading_option_4  

 

 本文链接:http://www.cnblogs.com/hhelibeb/p/5793215.html

 原文链接:Understanding CSV files and their handling in ABAP

转载请注明

转载于:https://www.cnblogs.com/hhelibeb/p/5793215.html

<think>好的,我现在需要帮助用户解决在ABAP中使用CKM3进行导出操作的问题。首先,我需要回忆一下CKM3在SAP中的作用。CKM3是物料分类账相关的交易码,主要用于分析物料的实际成本,比如月末加权平均价等。用户可能是在处理成本核算时需要导出相关数据进行分析。 接下来,用户询问的是导出方法或教程。我需要考虑在ABAP中如何导出CKM3的数据。通常,SAP的标准事务码不一定有直接的导出功能,但用户可以通过屏幕上的导出按钮或者系统标准功能导出,比如使用ALV报表的导出功能。如果用户需要自动化或批处理,可能需要编写ABAP程序,使用函数模块如RFC_READ_TABLE或者直接查询底层表格,如MLCD、CKMLHD等。 另外,用户之前的问题中引用了CKM3的物料价格变化情况,说明他们可能在处理物料账的实际成本数据。因此,导出数据可能涉及这些表格中的特定字段,如物料号、期间、价格类型、金额等。需要注意的是权限问题,用户需要有相应的权限访问这些数据。 可能还需要考虑数据量大的情况,导出时是否要分批次处理,或者使用后台作业。同时,提醒用户注意系统配置,比如物料分类账是否已激活,以及数据的时间范围选择是否正确。 最后,生成相关问题时,需要考虑用户可能进一步的需求,比如数据处理、权限问题、性能优化,或者与其他模块的集成,比如与FI的集成或差异分析。这些问题可以帮助用户更全面地理解CKM3的使用和数据导出后的应用场景。</think>### ABAP中使用CKM3进行导出操作的方法 在ABAP中通过CKM3导出数据,主要涉及**物料分类账(Material Ledger)**的数据提取。以下是具体步骤和注意事项: --- #### 1. **标准CKM3界面导出** - **步骤**: 1. 在SAP界面输入事务码`CKM3`,进入物料分类账分析界面。 2. 输入筛选条件(如物料号、会计期间、工厂等),执行查询。 3. 在结果界面,使用系统标准导出功能: - 点击菜单栏的`列表` → `导出` → `电子表格`,可直接导出为Excel文件。 - 或使用快捷键`Ctrl+Shift+F9`导出到本地[^1]。 - **限制**: 仅支持当前屏幕显示的数据导出,若数据量较大需分页操作。 --- #### 2. **通过ABAP程序自定义导出** 若需自动化或批量导出,需编写ABAP程序。核心方法是通过查询物料分类账相关表(如`MLCD`、`CKMLHD`)提取数据。 ```abap REPORT ZCKM3_EXPORT. TABLES: mlcd, ckmlhd. DATA: lt_mlcd TYPE TABLE OF mlcd, lt_ckmlhd TYPE TABLE OF ckmlhd. SELECT-OPTIONS: s_matnr FOR mlcd-matnr, s_bwkey FOR mlcd-bwkey. START-OF-SELECTION. SELECT * FROM mlcd INTO TABLE lt_mlcd WHERE matnr IN s_matnr AND bwkey IN s_bwkey AND gjahr = '2023' "会计年度 AND periode = '08'. "期间 IF lt_mlcd IS NOT INITIAL. SELECT * FROM ckmlhd INTO TABLE lt_ckmlhd FOR ALL ENTRIES IN lt_mlcd WHERE kalnr = lt_mlcd-kalnr. ENDIF. "将数据下载到本地文件 CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING filename = 'C:\CKM3_Export.csv' filetype = 'ASC' CHANGING data_tab = lt_mlcd. ``` **关键点**: - **表关联**: `MLCD`存储物料分类账明细,`CKMLHD`为物料账头表,需通过`KALNR`关联。 - **字段选择**: 需明确导出字段(如物料号`MATNR`、价格类型`PRTYP`、金额`STPRS`等)。 - **权限检查**: 确保用户有`S_TABU_NAM`权限访问相关表。 --- #### 3. **使用RFC_READ_TABLE函数** 若需灵活导出,可通过函数`RFC_READ_TABLE`动态读取表数据: ```abap DATA: lt_data TYPE TABLE OF tab512. CALL FUNCTION 'RFC_READ_TABLE' EXPORTING query_table = 'MLCD' TABLES options = lt_options "筛选条件(如MATNR = '100001') data = lt_data. ``` --- #### 4. **注意事项** - **数据量控制**: 建议分期间或工厂导出,避免性能问题。 - **价格类型**: 注意区分标准价(`PRTYP=S`)与实际价(`PRTYP=V`)[^1]。 - **货币单位**: 确保导出字段包含货币字段`WAERS`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值