实现功能: 编写一个自定义的监听器,将逗号分隔符文件(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

最新文章

  1. 【NLP】Python NLTK 走进大秦帝国
  2. Insert or Merge &amp;&amp; Insertion or Heap Sort
  3. 设置TextView按下时变换文字颜色
  4. nginx实战2---浏览器设置缓存
  5. git clean 使用方法
  6. cocos2d-x之action初试
  7. GROUP BY和ORDER BY共用
  8. c++学习之:根据GetLastError()返回值获取错误信息
  9. JS把函数当作参数传递
  10. jmeter,监控插件
  11. logstash tomcat catalina.out zabbix 插件不会引起崩溃
  12. JQuery日记6.9 Promise/A之Callbacks
  13. JavaScript之arguments.callee
  14. three.js 3D 动画场景
  15. QM
  16. js的一些方法
  17. C语言 提取double的每一位
  18. P3833 [SHOI2012]魔法树
  19. nodejs 获取文件的编码方式
  20. ArcEngine对Blob字段赋值的方法

热门文章

  1. linux下mysql 5.7编写存储过程一直报错说Mysql server version for the right syntax
  2. [Udemy] ES 7 and Elastic Stack - part 2
  3. 应用安全-软件安全-漏洞CVE整理
  4. 什么是HIS、PACS、LIS、RIS
  5. Java:CAS(乐观锁)
  6. Codeforces Round #503 (by SIS, Div. 2) C. Elections (暴力+贪心)
  7. python学习第五十天shutil模块的用法
  8. [CQOI2009]dance跳舞(最大流+二分)
  9. spark sql 创建DataFrame
  10. C# 实现实体类和Xml转换