你能推荐一个Java图书馆的阅读(以及可能写作)CSV文件吗?[关闭]

StackOverflow https://stackoverflow.com/questions/200609

  •  03-07-2019
  •  | 
  •  

你能推荐一个Java图书馆的阅读、分析、验证和绘图行中用逗号分隔值(CSV)文件Java值的对象(定时器的事件驱动方式)?

有帮助吗?

解决方案

我们已经习惯了 http://opencsv.sourceforge.net/ 取得了不错的成就

我还遇到了另一个有良好链接的问题: Java lib或app将CSV转换为XML文件?

其他提示

超级CSV 是一个伟大的选择阅读/析,验证和映射CSV的文件独!

我们(超CSV队)刚刚发布了一个新的版本(可以 下载 它从SourceForge或专家).

读一CSV文件

下述例子使用 CsvDozerBeanReader (a新的阅读器,我们刚刚发布的使用 推土机 对于bean映与深深的映射和基于指数绘图方面的支持)-这是基于例如从我们的 网站.如果你不需要推土机的功能(或者你只想要一个简单的独立依赖性),然后可以使用 CsvBeanReader 而不是(看看这个 代码的例子).

例CSV文件

这里是一个例子CSV文件,表示对调查。它有一个标题和3行的数据,有8列。

age,consentGiven,questionNo1,answer1,questionNo2,answer2,questionNo3,answer3
18,Y,1,Twelve,2,Albert Einstein,3,Big Bang Theory
,Y,1,Thirteen,2,Nikola Tesla,3,Stargate
42,N,1,,2,Carl Sagan,3,Star Wars

定义映从CSV组

每个行CSV将读取到一个 SurveyResponse 类,每一个都有一个列表中的 答案s.为了为映射工作,你的课程应该是有效的定时器的事件驱动方式(i。e有一个默认没有参数构造方法和已经吸气/者定义为每个字段)。

在超级CSV定义的映射一个简单的字符串阵列的每一个元件阵列,对应列在CSV文件。

CsvDozerBeanMapper 你可以使用:

  • 简单的字段映射(例如 firstName)

  • 深深的映射(例如 address.country.code)

  • 索引映射(例如 middleNames[1] -零基础的索引的数组或集)

  • 深+索引映射(例如 person.middleNames[1])

以下是该领域映这个实例-它使用一个组合这些:

private static final String[] FIELD_MAPPING = new String[] { 
        "age",                   // simple field mapping (like for CsvBeanReader)
        "consentGiven",          // as above
        "answers[0].questionNo", // indexed (first element) + deep mapping
        "answers[0].answer", 
        "answers[1].questionNo", // indexed (second element) + deep mapping
        "answers[1].answer", 
        "answers[2].questionNo", 
        "answers[2].answer" };

转换和验证

超级CSV有一个有用的图书馆 单元处理器, ,这可使用转换串CSV文件的其他数据的类型(例如今,整数),或者要做到约束的验证(例如强制性/可选的,regex匹配,范围检查).

采用单元处理器 完全可选的 -没有他们的每一列CSV将是一个串的,所以每个领域必须被一串。

以下是该单元处理器构成的例子。作为与外地映射,每个元件阵列代表计列。它表明如何单元处理器可以变换CSV数据的数据类型的领域,以及它们如何可以链接在一起。

final CellProcessor[] processors = new CellProcessor[] { 
    new Optional(new ParseInt()), // age
    new ParseBool(),              // consent
    new ParseInt(),               // questionNo 1
    new Optional(),               // answer 1
    new ParseInt(),               // questionNo 2
    new Optional(),               // answer 2
    new ParseInt(),               // questionNo 3
    new Optional()                // answer 3
};

阅读

阅读超CSV是非常灵活性:你提供自己的 Reader (所以你可以读一个文件,类路径,一个压缩文件,等等),并分隔和报价字是可以通过 喜好 (其中有一些预先确定的配置,满足对于大多数用途).

代码下面是不言自明的。

  1. 创建阅读器(与你的 Reader 和偏好)

  2. (可选)阅读头

  3. 配置豆映射

  4. 保持通话 read() 直到你得到一个 null (端的文件)

  5. 附近的读者

代码:

ICsvDozerBeanReader beanReader = null;
try {
    beanReader = new CsvDozerBeanReader(new FileReader(CSV_FILENAME),
        CsvPreference.STANDARD_PREFERENCE);

    beanReader.getHeader(true); // ignore the header
    beanReader.configureBeanMapping(SurveyResponse.class, FIELD_MAPPING);

    SurveyResponse surveyResponse;
    while( (surveyResponse = 
        beanReader.read(SurveyResponse.class, processors)) != null ) {
        System.out.println(
            String.format("lineNo=%s, rowNo=%s, surveyResponse=%s",
                beanReader.getLineNumber(), beanReader.getRowNumber(), 
                surveyResponse));
    }

} finally {
    if( beanReader != null ) {
        beanReader.close();
    }
}

输出:

lineNo=2, rowNo=2, surveyResponse=SurveyResponse [age=18, consentGiven=true, answers=[Answer [questionNo=1, answer=Twelve], Answer [questionNo=2, answer=Albert Einstein], Answer [questionNo=3, answer=Big Bang Theory]]]
lineNo=3, rowNo=3, surveyResponse=SurveyResponse [age=null, consentGiven=true, answers=[Answer [questionNo=1, answer=Thirteen], Answer [questionNo=2, answer=Nikola Tesla], Answer [questionNo=3, answer=Stargate]]]
lineNo=4, rowNo=4, surveyResponse=SurveyResponse [age=42, consentGiven=false, answers=[Answer [questionNo=1, answer=null], Answer [questionNo=2, answer=Carl Sagan], Answer [questionNo=3, answer=Star Wars]]]

更多信息

你可以找到更多的信息 网站!

我可以推荐 SuperCSV 。简单易用,并做了我需要的一切。

嘿,我有一个开源项目: JFileHelpers 。我认为主要的优点是它使用Java Annotations,看看:

如果你有这个bean:

@FixedLengthRecord()
public class Customer {
    @FieldFixedLength(4)
    public Integer custId;

    @FieldAlign(alignMode=AlignMode.Right)
    @FieldFixedLength(20)
    public String name;

    @FieldFixedLength(3)
    public Integer rating;

    @FieldTrim(trimMode=TrimMode.Right)
    @FieldFixedLength(10)
    @FieldConverter(converter = ConverterKind.Date, 
    format = "dd-MM-yyyy")
    public Date addedDate;

    @FieldFixedLength(3)
    @FieldOptional
    public String stockSimbol;    
}

想要解析这个文件:

....|....1....|....2....|....3....|....4                
1   Antonio Pereira     10012-12-1978ABC
2   Felipe Coury          201-01-2007
3   Anderson Polga       4212-11-2007DEF      

你所要做的就是:

FileHelperEngine<Customer> engine = 
    new FileHelperEngine<Customer>(Customer.class); 
List<Customer> customers = 
    new ArrayList<Customer>();

customers = engine.readResource(
    "/samples/customers-fixed.txt");

此外,它还支持主细节,日期和格式转换等等。让我知道你的想法!

祝你好运!

我发现 Flatpack 非常适合处理古怪的CSV文件(转义,引号,不良记录,等)

之前询问的CSV文件到XML问题似乎回答了我的所有问题。

OpenCSV( http://opencsv.sourceforge.net/ )也使用a绑定到JavaBeans列位置映射策略

  ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
  strat.setType(YourOrderBean.class);
  String[] columns = new String[] {"name", "orderNumber", "id"}; // the fields to bind do in your JavaBean
  strat.setColumnMapping(columns);

  CsvToBean csv = new CsvToBean();
  List list = csv.parse(strat, yourReader);

JSEFA( http://jsefa.sourceforge.net )似乎也做了我需要的一切 - 特别是绑定到Java对象 - 除了支持FLR和XML

我使用 OpenCSV 从Java解析和编写CSV文件取得了很好的成功。如果您想使用Java读取或编写Excel兼容的电子表格,那么Apache的 POI 库就是您的选择。

请参阅 CVSBeans

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top