用Java解析Java - 工作实例..?

And*_*idt 17 java csv

我想为学校java项目编写一个程序来解析一些我不知道的CSV.我知道每列的数据类型 - 虽然我不知道分隔符.

我甚至不知道如何修复的问题是解析日期甚至DateTime列.它们可以是多种格式之一.

我找到了很多图书馆,但不知道哪个图书馆最符合我的需求:http: //opencsv.sourceforge.net/ http://www.csvreader.com/java_csv.php http://supercsv.sourceforge.net/ http ://flatpack.sourceforge.net/

问题是我是一个java初学者.我担心没有那些图书馆可以做我需要的,或者我无法说服他们去做.

我打赌这里有很多人都有代码示例,可以让我立刻开始我需要的东西:

  • 自动拆分列(分隔符未知,Columntypes已知)
  • 施放到Columntype(应该应付$,%等)
  • 将日期转换为Java日期或日历对象

通过电子邮件获取尽可能多的代码示例会很不错.

非常感谢!如

Val*_*her 18

您还拥有Apache Commons CSV库,也许它可以满足您的需求.请参阅指南.已更新至2014-11版的1.1版.

此外,对于万无一失的版本,我认为你需要自己编码...通过SimpleDateFormat你可以选择你的格式,并指定各种类型,如果Date不像你的任何预先考虑的类型,它不是一个约会.

  • Apache Commons"上次发布时间:2008年5月17日|版本:1.0-SNAPSHOT""目前还没有官方下载,直到CSV移出Sandbox,但是每晚都可以使用......"嗯,不是太令人信服...... (7认同)
  • **更新**[Apache Commons CSV](https://commons.apache.org/proper/commons-csv/)确实成功完成了一个项目.本月发布的1.1版(2014-11). (2认同)

Agi*_*Pro 18

使用时存在严重问题

String[] strArr=line.split(",");
Run Code Online (Sandbox Code Playgroud)

为了解析CSV文件,这是因为数据值中可能有逗号,在这种情况下,您必须引用它们,并忽略引号之间的逗号.

有一种非常简单的方法可以解析它:

/**
* returns a row of values as a list
* returns null if you are past the end of the input stream
*/
public static List<String> 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<String> store = new Vector<String>();
    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;
}
Run Code Online (Sandbox Code Playgroud)

这种方法有许多优点.请注意,每个字符都会被触摸一次.没有提前读取,推回缓冲区等.不要在行结束前搜索,然后在解析之前复制该行.此解析器纯粹从流中工作,并创建一次每个字符串值.它适用于标题行和数据行,您只需处理适合于此的返回列表.您为它提供了一个阅读器,因此使用您选择的任何编码将基础流转换为字符.流可以来自任何来源:文件,HTTP帖子,HTTP get,并直接解析流.这是一个静态方法,因此没有对象可以创建和配置,当它返回时,没有内存被保留.

您可以在我的博客文章中找到关于此代码的完整讨论,以及为什么选择此方法: CSV文件所需的唯一类.


Bri*_*per 7

我的方法不是从编写自己的API开始.生命太短暂,还有更迫切需要解决的问题.在这种情况下,我通常:

  • 找一个看起来像我想做的图书馆.如果不存在,实现它.
  • 如果库确实存在,但我不确定它是否适合我的需求,请在它周围编写一个瘦适配器API,这样我就可以控制它的调用方式.适配器API表示需要的API ,并将这些调用映射到底层API.
  • 如果库不合适,我可以用最少的努力交换适配器API下面的另一个(无论是另一个开源的,我自己写的东西),而不影响调用者.

从某人已经写过的东西开始.可能性很大,它会做你想要的.如有必要,您以后可以随时编写自己的文件.OpenCSV是一个很好的起点.


Ric*_*est 0

至少您需要知道列分隔符。