在很多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)   写下你的代码

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

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

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

  缺点:

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

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

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

2)   使用KCD_CSV_FILE_TO_INTERN_CONVERT读取文件

  1. CALL FUNCTION 'KCD_CSV_FILE_TO_INTERN_CONVERT'
  2. EXPORTING
  3. i_filename = 'C:\Temp\Upload.csv'
  4. i_separator = ','
  5. TABLES
  6. e_intern = gt_intern
  7. EXCEPTIONS
  8. upload_csv =
  9. upload_filetype = .

  缺点:

  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文件,使用默认参数。

  1. * Instantiate the CSV object
  2.  
  3. call method cl_rsda_csv_converter=>create
  4. * EXPORTING
  5. * i_delimiter = C_DEFAULT_DELIMITER
  6. * i_separator = C_DEFAULT_SEPARATOR
  7. receiving
  8. r_r_conv = lo_csv
  9.  
  10. * Process records
  11. loop at lt_upload_data into lv_data.
  12. CALL METHOD lo_csv->csv_to_structure
  13. EXPORTING
  14. i_data = lv_data
  15. IMPORTING
  16. 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

转载请注明

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

  1. Pandas之csv文件对列行的相关操作

    1.Pandas对数据某一列删除 1.删除列 import pandas as pd df = pd.read_csv(file) #axis=1就是删除列 df.drop(['列名1','列名2'] ...

  2. Lua读取CSV文件到table中

    创建Lua函数载入CSV文件并保存到表中的函数: function GetLines(fileName) indx = 0 myLines ={} for line in io.line(string ...

  3. 读取CSV文件存入map中(C++)

    自己平时操作文件用的不多,今天小伙伴让帮忙写一下这个,顺便记一下.实现功能:从"翻译.csv"文件中读取出字符串,以","作为分隔符,将每一行对应存入map中. ...

  4. CSV文件在Python中的几种处理方式

    Comma Separated Values,简称CSV,它是一种以逗号分隔数值的文件类型.在数据库或电子表格中,它是最常见的导入导出格式,它以一种简单而明了的方式存储和共享数据,CSV文件通常以纯文 ...

  5. php生成csv文件并提供下载及相关注意事项

    1.生成文件过程略,只要逗号分割就可以了 2.提供下载加上如下代码: header("Content-type: application/octet-stream"); heade ...

  6. 工作小记[csv文件、admin中filed与list_display区别、ModuleNotFoundError: No module named'xxx'、django创建admin用户]

    CSV-Comma Separated Values,CSV文件可以直接用Excel表格打开,如果用文本打开属性之间用逗号隔开,Python有直接操作CSV文件的函数. fileds字段控制“修改添加 ...

  7. 记录工作中linux相关操作

    在项目部署之后,查看日志能查看部署结果是否正确部署. 最开始查看日志我会使用cat service.log tail -f service.log vim service.log 打开日志之后 /+查 ...

  8. ueditor 插件集成到 xadmin 中的相关操作

    安装 点击这里下载源码包 在相关的虚拟环境下安装源码方式安装 切入解压后路径进行 python setup.py install 注册 安装成功按照普通app一般注册在 django 程序的app 中 ...

  9. Java中JSONObject相关操作

    maven项目pom配置: <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>js ...

随机推荐

  1. 当GitHub把我当成DDos攻击者拉进了黑名单中。。。

    Github黑名单自救+快速稳定FQ 异常处理汇总-开发工具  http://www.cnblogs.com/dunitian/p/4522988.html 原因:项目冲突,没有先更新后提交,他自行更 ...

  2. 【WP 8.1开发】How to 图像处理

    在今天的吹牛节目开始之前,先交代一件事: 关于玩WP 8.1开发所使用的VS版本问题.对版本的要求是2013的Update2,这是最低要求,只要是这个版本或以上都可以,而update3,update4 ...

  3. WPF DatePicker只显示年和月 修改:可以只显示年

    最近的项目,查询时只需要年和月,不需要日,因此需要对原有的DatePicker进行修改,查询了网上的内容,最终从一篇帖子里看到了添加附加属性的方法,地址是http://stackoverflow.co ...

  4. ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【解读ServiceCallSite 】

    通过上一篇的介绍我们应该对实现在ServiceProvider的总体设计有了一个大致的了解,但是我们刻意回避一个重要的话题,即服务实例最终究竟是采用何种方式提供出来的.ServiceProvider最 ...

  5. android标题栏上面弹出提示框(二) PopupWindow实现,带动画效果

    需求:上次用TextView写了一个从标题栏下面弹出的提示框.android标题栏下面弹出提示框(一) TextView实现,带动画效果,  总在找事情做的产品经理又提出了奇葩的需求.之前在通知栏显示 ...

  6. jsonp跨域+ashx(示例)

    前言 做B/S项目的时候,我们一般使用jquery+ashx来实现异步的一些操作,比如后台获取一些数据到前台,但是如果ashx文件不在本项目下,引用的是别的域下的文件,这时候就访问不了.关于jsonp ...

  7. 【记录】JS 获取图片原始尺寸-防止图片溢出

    示例代码: <div id="div_content"> <img src="http://static.cnblogs.com/images/logo ...

  8. objective-c中的@selector()和 c /c++的函数指针

    先看tomcat里用到的代码: //然后开始动画 //把图片放到animationImages,接受数组参数 self.tom.animationImages = arrayImage; //设置时间 ...

  9. c 语言的位运算符复习

    转载和修正,原文连接:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进 ...

  10. 在SQL Server里我们为什么需要意向锁(Intent Locks)?

    在1年前,我写了篇在SQL Server里为什么我们需要更新锁.今天我想继续这个讨论,谈下SQL Server里的意向锁,还有为什么需要它们. SQL Server里的锁层级 当我讨论SQL Serv ...