csv java 解析_Java中的CSV解析-工作示例..?

369adc3151000e0c0f12268f0a4f0fdd.png

holdtom

使用存在严重问题String[] strArr=line.split(",");为了分析CSV文件,这是因为数据值中可能包含逗号,在这种情况下,您必须对它们加引号,而忽略引号之间的逗号。有一个非常简单的方法可以解析此:/*** returns a row of values as a list* returns null if you are past the end of the input stream*/public static List parseLine(Reader r) throws Exception {    int ch = r.read();    while (ch == '\r') {        //ignore linefeed chars wherever, particularly just before end of file        ch = r.read();    }    if (ch<0) {        return null;    }    Vector store = new Vector();    StringBuffer curVal = new StringBuffer();    boolean inquotes = false;    boolean started = false;    while (ch>=0) {        if (inquotes) {            started=true;            if (ch == '\"') {                inquotes = false;            }            else {                curVal.append((char)ch);            }        }        else {            if (ch == '\"') {                inquotes = true;                if (started) {                    // if this is the second quote in a value, add a quote                    // this is for the double quote in the middle of a value                    curVal.append('\"');                }            }            else if (ch == ',') {                store.add(curVal.toString());                curVal = new StringBuffer();                started = false;            }            else if (ch == '\r') {                //ignore LF characters            }            else if (ch == '\n') {                //end of a line, break out                break;            }            else {                curVal.append((char)ch);            }        }        ch = r.read();    }    store.add(curVal.toString());    return store;}这种方法有很多优点。请注意,每个字符仅被触摸一次。没有向前读取,没有向后推缓冲区,等等。没有向前搜索到行尾,然后在解析之前复制了该行。此解析器仅从流中工作,并且每个字符串值创建一次。它适用于标题行和数据行,您只需要处理返回的列表即可。您为它提供了一个阅读器,因此基础流已使用您选择的任何编码转换为字符。流可以来自任何来源:文件,HTTP帖子,HTTP get,您可以直接解析流。这是一个静态方法,因此没有要创建和配置的对象,并且当返回时,没有任何内存被保留。您可以找到有关此代码的完整讨论,以及为什么在我的主题为CSV文件的唯一类的博客文章中首选此方法 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值