ANTLR4加载csv数据
2024-09-05 17:47:41
实现功能: 编写一个自定义的监听器,将逗号分隔符文件(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
最新文章
- 【NLP】Python NLTK 走进大秦帝国
- Insert or Merge &;&; Insertion or Heap Sort
- 设置TextView按下时变换文字颜色
- nginx实战2---浏览器设置缓存
- git clean 使用方法
- cocos2d-x之action初试
- GROUP BY和ORDER BY共用
- c++学习之:根据GetLastError()返回值获取错误信息
- JS把函数当作参数传递
- jmeter,监控插件
- logstash tomcat catalina.out zabbix 插件不会引起崩溃
- JQuery日记6.9 Promise/A之Callbacks
- JavaScript之arguments.callee
- three.js 3D 动画场景
- QM
- js的一些方法
- C语言 提取double的每一位
- P3833 [SHOI2012]魔法树
- nodejs 获取文件的编码方式
- ArcEngine对Blob字段赋值的方法
热门文章
- linux下mysql 5.7编写存储过程一直报错说Mysql server version for the right syntax
- [Udemy] ES 7 and Elastic Stack - part 2
- 应用安全-软件安全-漏洞CVE整理
- 什么是HIS、PACS、LIS、RIS
- Java:CAS(乐观锁)
- Codeforces Round #503 (by SIS, Div. 2) C. Elections (暴力+贪心)
- python学习第五十天shutil模块的用法
- [CQOI2009]dance跳舞(最大流+二分)
- spark sql 创建DataFrame
- C# 实现实体类和Xml转换