ANTLR4加载csv数据
实现功能: 编写一个自定义的监听器,将逗号分隔符文件(csv)中的数据加载到一种数据结构--“由Map组成的List”中。
antlr4文件:
grammar CSV;
file : hdr row+ ;
hdr : row ;
row : field (',' field)* '\r'? '\n' ;
field
: TEXT # text
| STRING # string
| # empty
;
TEXT : ~[,\n\r"]+ ;
STRING : '"' ('""'|~'"')* '"' ;

LoadCSV.java 文件:
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTreeWalker; import java.io.*;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map; class Loader extends CSVBaseListener {
public static final String EMPTY = "";
/**
* Load a list of row maps that map field name to value
*/
List<Map<String, String>> rows = new ArrayList<Map<String, String>>();
/**
* List of column names
*/
List<String> header;
/**
* Build up a list of fields in current row
*/
List<String> currentRowFieldValues; public void exitString(CSVParser.StringContext ctx) {
currentRowFieldValues.add(ctx.STRING().getText());
}
public void exitText(CSVParser.TextContext ctx) {
currentRowFieldValues.add(ctx.TEXT().getText());
}
public void exitEmpty(CSVParser.EmptyContext ctx) {
currentRowFieldValues.add(EMPTY);
}
public void exitHdr(CSVParser.HdrContext ctx) {
header = new ArrayList<String>();
header.addAll(currentRowFieldValues);
}
public void enterRow(CSVParser.RowContext ctx) {
currentRowFieldValues = new ArrayList<String>();
}
public void exitRow(CSVParser.RowContext ctx) {
// If this is the header row, do nothing
// if ( ctx.parent instanceof CSVParser.HdrContext ) return; OR:
if ( ctx.getParent().getRuleIndex() == CSVParser.RULE_hdr ) return;
// It's a data row
Map<String, String> m = new LinkedHashMap<String, String>();
int i = 0;
for (String v : currentRowFieldValues) {
m.put(header.get(i), v);
i++;
}
rows.add(m);
} } public class LoadCSV {
public static void main(String[] args) throws IOException {
/*
新的版本已经抛弃
File csvFile = new File("F:\\IDEA_JAVA\\CSV\\test\\test.csv");
InputStream fi = new FileInputStream(csvFile);
ANTLRInputStream inputStream = new ANTLRInputStream(fi);
CSVLexer lexer = new CSVLexer(inputStream);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
CSVParser parser = new CSVParser(tokenStream);
ParseTreeWalker walker = new ParseTreeWalker();
Loader loader = new Loader();
walker.walk(loader, parser.file());
System.out.println(loader.rows);
*/
String path = "F:\\IDEA_JAVA\\CSV\\test\\test.csv";
CharStream inputStream = CharStreams.fromFileName(path);
CSVLexer lexer = new CSVLexer(inputStream);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
CSVParser parser = new CSVParser(tokenStream);
ParseTreeWalker walker = new ParseTreeWalker();
Loader loader = new Loader();
walker.walk(loader, parser.file());
System.out.println(loader.rows);
}
}

提取码:i4xh
ANTLR4加载csv数据的更多相关文章
- python加载csv数据
入门机器学习时,一些测试数据是网络上的csv文件.这里总结了两种加载csv文件的方式: 1 通过numpy.urllib2加载 import numpy as np import urllib2 ur ...
- pgloader 学习(六) 加载csv 数据
关于加载的配置参数都是使用comand file command file 参考格式 LOAD CSV FROM 'GeoLiteCity-Blocks.csv' WITH ENCODING iso- ...
- Learning Spark中文版--第五章--加载保存数据(1)
开发工程师和数据科学家都会受益于本章的部分内容.工程师可能希望探索更多的输出格式,看看有没有一些适合他们下游用户的格式.数据科学家可能会更关注他们已经使用的数据格式. Motivation 我 ...
- D3.js加载csv和json数据
1.加载数据的基本命令 D3提供了方法可以对不同的数据类型进行加载,比如d3.text(), d3.xml(), d3.json(), d3.csv(), 和d3.html(). <!DOCTY ...
- hive加载json数据解决方案
hive官方并不支持json格式的数据加载,默认支持csv格式文件加载,如何在不依赖外部jar包的情况下实现json数据格式解析,本编博客着重介绍此问题解决方案 首先创建元数据表: create EX ...
- Python爬虫爬取异步加载的数据
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:努力努力再努力 爬取qq音乐歌手数据接口数据 https://y.qq ...
- geotrellis使用(二十三)动态加载时间序列数据
目录 前言 实现方法 总结 一.前言 今天要介绍的绝对是华丽的干货.比如我们从互联网上下载到了一系列(每天或者月平均等)的MODIS数据,我们怎么能够对比同一区域不同时间的数据情况,采用 ...
- WPF DataGrid 性能加载大数据
WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系 ...
- 基于zepto的H5/移动端tab切换触摸拖动加载更多数据
以前实现移动端的滑动加载更多实现的方法是当滚动条快到页面底部时就自动加载更多的数据,在这方面很多人都用的是"西门的后花园"写的一个叫dropload的插件,这个插件用起来也很好,很 ...
随机推荐
- 时间同步,使用oracle自带的ctss
crsctl check ctss --observer mode cluvfy comp clocksync -检查crss为啥没启用 根据不同版本删除ntp的配置和服务 AIX: stops ...
- 视频格式转换.ZC资料
1.20191013: ZC:这些都是 2015年做的尝试,之前貌似没有记录下来,现在 再次用到,把用到的记录下来: ZC: (1) 使用的视频格式转换工具是 "??/XiGua Yings ...
- python3.5+django2.0快速入门(一)
因为这篇教程需要用到anaconda的一些操作,如果还不懂anaconda的操作的同学可以看下这篇文章python 入门学习之anaconda篇. 创建python3+的开发环境 直接在终端输入:co ...
- ntp局域网时间同步操作
需求:局域网里面有两台电脑需要同步时间 一台windows,一台Linux.把windows当作服务器 windows10自带ntp服务器,可以按如下步骤进行设置 1. 打开注册表编辑器,在运行里面输 ...
- Socket服务端和客户端文件传输
很多朋友在使用socket编程时不可避免的都做过文件传输,而视频电影等需要一个字节一个字节的传输:但是客户端一般都通过-1进行终止,服务也一样:但是存在的问题是客户端永远不会把-1传递给服务端:因此经 ...
- SQL的“增删改”
结构语言分类 DDL(数据定义语言) create drop alter 创建删除以及修改数据库,表,存储过程,触发器,索引.... DML(数据操作语言) insert delete ...
- $.ajax()方法详解(网上引用)
jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(p ...
- 高性能和可扩展的React-Redux
注意:文章很长,只想了解逻辑而不深入的,可以直接跳到总结部分. 初识 首先,从它暴露对外的API开始 ReactReduxContext /* 提供了 React.createContext(null ...
- ES6——generator
generator 生成器函数 普通函数,一路到底 generator函数,中间可以停,到哪停呢,用 yield 配合,交出执行权 yield 有 放弃.退让.退位的意思 需要调用next()方法启动 ...
- Apache Mesos 官方文档 V1.0
Apache Mesos 官方文档 V1.0 2016-11-07 中文版:http://mesos.mydoc.io/ gitBook :https://www.gitbook.com/book/m ...