scala通过尾递归解析提取字段信息
一、背景
获取数据中以“|”作为字段间的分隔符,但个别字段中数据也是以“|”作为分隔符。因此,在字段提取时需要保护数据完整性。
二、实现
1.数据以“|”分隔,可以采用递归方式迭代解析。通过尾递归方式降低运行风险;
2.尾递归中使用模式匹配;
3.解析时,根据separator做遍历,“‘”和“’”(一对引号之间的数据作为一个整体cell),引号前数据位head(即使为空,也可以),cell后的数据由下一次迭代解析,则整个结构为:result+head+cell(引号间的数据)+(head+cell+(head+cell+(...)))
4.默认数据中引号成对出现;
5.具体实现如下:
val input="123||abc||lat|||'120.15|34.56'||lon||'112.135|30.124'|location|grid|'101|26|37'|0755|x|"
def separator(str:String,sep:String,result:Array[String]):Array[String]={str.indexOf(sep) match{
case v if v<0 =>result++str.split("\\|",-1)
case x =>{
val head=str.substring(0,x).stripSuffix("|").split("\\|",-1)
val next=str.substring(x+1).indexOf(sep)
val cell=Array(str.substring(x+1,x+next+1).replaceAll("\\|",","))
separator(str.substring(x+next+3),sep,result++head++cell)}
}}
println(separator(input,"'",Array()).toList)
三、总结
1.使用尾递归时,要保证每次迭代要有结果作为下次迭代的输入;
2.substring提取子字符串时为前闭后开;
3.字符串做split时尽量使用index=-1,保证||之间为一个空的数据,但不能丢弃;
4.replaceAll替换字符时,注意".$|()[{^?*+\\"需要做转译;
5.保证|‘不会产生多余空元素,需要对head的字符串做stripSuffix去除动作。

scala通过尾递归解析提取字段信息的更多相关文章
- extract_by_one 根据二维数组中某字段来提取数组信息,查看有无重复信息
public function tt(){ $param = array( array ( 'hykno' => '2222222-CB', 'tcdk_fid' => '458B6D70 ...
- Scala词法文法解析器 (二)分析C++类的声明
最近一直在学习Scala语言,偶然发现其Parser模块功能强大,乃为BNF而设计.啥是BNF,读大学的时候在课本上见过,那时候只觉得这个东西太深奥.没想到所有的计算机语言都是基于BNF而定义的一套规 ...
- Scrapy基础(六)————Scrapy爬取伯乐在线一通过css和xpath解析文章字段
上次我们介绍了scrapy的安装和加入debug的main文件,这次重要介绍创建的爬虫的基本爬取有用信息 通过命令(这篇博文)创建了jobbole这个爬虫,并且生成了jobbole.py这个文件,又写 ...
- python调用mediainfo工具批量提取视频信息
写了2个脚本,分别是v1版本和v2版本 都是python调用mediainfo工具提取视频元数据信息 v1版本是使用pycharm中测试运行的,指定了视频路径 v2版本是最终交付给运营运行的,会把v2 ...
- java 解析http user-agent 信息
解析http user-agent信息,使用uasparser-0.6.1.jar和jregex-1.2_01.jar两个包 import cz.mallat.uasparser.OnlineUpda ...
- 从APNIC提取IP信息
从APNIC提取IP信息 https://blog.csdn.net/nullzeng/article/details/17538009 Apnic介绍简而言之,Apnic是全球5个地区级的Inter ...
- Scala词法文法解析器 (一)解析SparkSQL的BNF文法
平台公式及翻译后的SparkSQL 平台公式的样子如下所示: if (XX1_m001[D003]="邢おb7肮α䵵薇" || XX1_m001[H003]<"2& ...
- tika提取pdf信息异常
org.apache.tika.sax.WriteOutContentHandler$WriteLimitReachedException: Your document contained more ...
- c# 借助cmd命令解析apk文件信息
借助aapt.exe文件 aapt.exe 解析apk包信息cmd命令: aapt dump badging *.apkaapt d badging *.apk >1.txt(保存成1.txt文 ...
随机推荐
- vs2010编译C++ 栈的使用
// CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...
- 解决win10创建Django工程,运行django-admin.py startproject 工程名,失败的问题
在看我这篇教程的前提是你应该已经正确装好python和Django了,好了,废话不说了,正题走你!你现在是不是很纠结自己运行django-admin.py startproject 工程名 ...
- R box-cox变换 《回归分析与线性统计模型》page100
> rm(list = ls()) > library(openxlsx) > electric= read.xlsx("data101.xlsx",sheet ...
- Android拷贝工程不覆盖原工程的配置方法
http://www.2cto.com/kf/201203/125131.html 在Eclipse中改包名的时候选择refactor-->rename,勾选Rename subpackages ...
- Day6 - 牛客102C
链接:https://ac.nowcoder.com/acm/contest/102/C来源:牛客网 题目描述 We define a value of an interval is the seco ...
- 017、MySQL取第4本季度开始和结束日期
#取第4本季度开始和结束日期 SELECT QUARTER ( adddate( dy, ) ) QTR, date_add( dy, INTERVAL MONTH ) Q_start, adddat ...
- 二次urldecode注入
原理大多数web程序都会对输入字符进行转换,例如addslashes(),mysql_real_escape_string(),mysql_escape_string(),也就是对单引号',双引号&q ...
- R apply()函数
创建一个列表变量,它的第一个元素包含所有从0到9的平方数,第二个元素为10到19之内的所有平方数,依此类推,最后一个元素为90到99之内的平方数.没有平方数的元素也应该被包含在内! 学习网友的解题思路 ...
- 十五、JavaScript之除法
一.代码如下 二.执行效果如下 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" cont ...
- C# 借助CommandLine 写命令行工具 在数据库中创建job
首先需要用到 CommandLine.dll 提供两个下载链接,云盘是我自己上传的,也就是我在用的 http://commandline.codeplex.com/ https://pan.baid ...