理解CSV文件以及ABAP中的相关操作
在很多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 =
upload_filetype = .
缺点:
a) 文件只能从表示服务器/桌面中读取。注:有关表示服务器(Presentation Server)的内容,请参考SAP系统架构的相关内容。
b) 如果CSV文件中存在双引号,最后一个字段会保留双引号。(待验证)
c) 在文件从服务端读取的情况下,我们需要阅读这个函数的内部代码,并且写一些自定义的逻辑。
3) 通过函数模块 RSDS_CONVERT_CSV使用RTTI和动态编程
这是一个有效的办法,但是包含了大量的代码。你可以看看这个GIST中的代码:
总的来说步骤是这样的:
——使用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。
如果你懒得键入全部程序,这里有全部源代码:
本文链接:http://www.cnblogs.com/hhelibeb/p/5793215.html
原文链接:Understanding CSV files and their handling in ABAP
转载请注明
理解CSV文件以及ABAP中的相关操作的更多相关文章
- Pandas之csv文件对列行的相关操作
1.Pandas对数据某一列删除 1.删除列 import pandas as pd df = pd.read_csv(file) #axis=1就是删除列 df.drop(['列名1','列名2'] ...
- Lua读取CSV文件到table中
创建Lua函数载入CSV文件并保存到表中的函数: function GetLines(fileName) indx = 0 myLines ={} for line in io.line(string ...
- 读取CSV文件存入map中(C++)
自己平时操作文件用的不多,今天小伙伴让帮忙写一下这个,顺便记一下.实现功能:从"翻译.csv"文件中读取出字符串,以","作为分隔符,将每一行对应存入map中. ...
- CSV文件在Python中的几种处理方式
Comma Separated Values,简称CSV,它是一种以逗号分隔数值的文件类型.在数据库或电子表格中,它是最常见的导入导出格式,它以一种简单而明了的方式存储和共享数据,CSV文件通常以纯文 ...
- php生成csv文件并提供下载及相关注意事项
1.生成文件过程略,只要逗号分割就可以了 2.提供下载加上如下代码: header("Content-type: application/octet-stream"); heade ...
- 工作小记[csv文件、admin中filed与list_display区别、ModuleNotFoundError: No module named'xxx'、django创建admin用户]
CSV-Comma Separated Values,CSV文件可以直接用Excel表格打开,如果用文本打开属性之间用逗号隔开,Python有直接操作CSV文件的函数. fileds字段控制“修改添加 ...
- 记录工作中linux相关操作
在项目部署之后,查看日志能查看部署结果是否正确部署. 最开始查看日志我会使用cat service.log tail -f service.log vim service.log 打开日志之后 /+查 ...
- ueditor 插件集成到 xadmin 中的相关操作
安装 点击这里下载源码包 在相关的虚拟环境下安装源码方式安装 切入解压后路径进行 python setup.py install 注册 安装成功按照普通app一般注册在 django 程序的app 中 ...
- Java中JSONObject相关操作
maven项目pom配置: <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>js ...
随机推荐
- 【.NET深呼吸】存储基于本地线程的值
在特定情况,我们希望这样一个场景: N个线程同时调用同一个类实例的同一个操作方法,并且同一个变量可以面向每一个线程存储独立的值.比如,某变量X,它对于线程A的值与对于线程B的值是相互独立的.线程A设置 ...
- 数据结构与算法JavaScript (二) 队列
队列是只允许在一端进行插入操作,另一个进行删除操作的线性表,队列是一种先进先出(First-In-First-Out,FIFO)的数据结构 队列在程序程序设计中用的非常的频繁,因为javascript ...
- BOOST Voronoi Visualizer
BOOST Voronoi Visualizer eryar@163.com Abstract. The Voronoi extension of the Boost.Polygon library ...
- 前端学PHP之函数
× 目录 [1]函数定义 [2]函数参数[3]返回值[4]变量函数[5]回调函数[6]递归函数[7]加载函数[8]匿名函数 前面的话 PHP 的真正力量来自它的函数:它拥有超过 1000 个内建的函数 ...
- .NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)
今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinatorics组件的使用情况,其实这个组件我5年前就开始用了,非常方便,麻雀虽小五脏俱全.所以一直非常喜欢,才写了几 ...
- WebAPi添加常用扩展方法及思维发散
前言 在WebAPi中我们通常需要得到请求信息中的查询字符串或者请求头中数据再或者是Cookie中的数据,如果需要大量获取,此时我们应该想到封装一个扩展类来添加扩展方法,从而实现简便快捷的获取. We ...
- Android随笔之——按键长按事件onKeyLongPress
现在安卓手机实体键是越来越少了,但还是有的,恰好自己就碰上了:按键的长按事件...百度了一些博客,内容都基本上是完全一样的,虽然可以捕获到长按事件,但却会和正常的单击冲突.幸好最近开个VPN,goog ...
- CDH安装失败了,如何重新安装
1> 删除Agent节点的UUID # rm -rf /opt/cm-5.4.7/lib/cloudera-scm-agent/* 2> 清空主节点CM数据库 进入主节点的Mysql数据 ...
- Spark入门实战系列--10.分布式内存文件系统Tachyon介绍及安装部署
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Tachyon介绍 1.1 Tachyon简介 随着实时计算的需求日益增多,分布式内存计算 ...
- reflow和repaint(摘录自张鑫旭的翻译)
//正文开始 关于回流(reflows)与重绘(repaints),我已经在twitter和delicious上发布,但是并没有在演讲中提到或是以文章形式发布. 第一次让我开始思考关于回流(reflo ...