是否有一个Java库可以让我轻松地从String中保存的CSV文本中提取数据

时间:2011-11-13 22:37:18

标签: java csv

我正在寻找一个Java库,它可以让我轻松地从内存中保存的CSV文本的特定列(或多列)中提取数据,例如在一个字符串中。

例如,将以下记录中的每个“城镇”值提取到ArrayList<String>对象或String[]。或者更进一步,从每条记录中提取所有“城镇”和“国家”值。

...我最好需要一种不依赖于固定位置的柱子的解决方案。

ADDRESS|HOUSE_NO|STREET|TOWN|CITY|COUNTY|COUNTRY
DATA|51|Hill Road|Reading|Berkshire|United Kingdom
DATA|78|Crescent Road|Wallingford|Oxfordshire|United Kingdom
DATA|5|Bonny Crescent|Swindon|Whiltshire|United Kingdom

...请注意,上例中的整个CSV部分都包含在内存中的单个字符串中。

我一直在考虑使用像H2这样的内存数据库引擎的选项,但它似乎无法处理针对存储在内存中的CSV文本运行SQL查询,例如在一个字符串中。有什么建议?提前致谢

2 个答案:

答案 0 :(得分:2)

我在所有项目中使用opencsv。它是一个非常好的库,可以在Maven中心使用,因此如果您使用maven,它很容易添加到您的项目中。

答案 1 :(得分:0)

使用String.split

String[] tokens = myString.split("\\|");

但我想指出,如果您有数据库,则不应将其存储为CSV。您应该创建一个表并为其创建列。所以我会强烈考虑在将它放入数据库之前执行此操作,并在此时将其放入正确的列中。

如果ENTIRE文件是单个字符串,我会这样做:

final String delim = "\\|";
Scanner sc = new Scanner(csvFile);
String headersRaw = sc.nextLine();
String[] headers = headersRaw.split(delim);
// process headers if necessary
while(sc.hasNextLine()) {
    String[] tokens = sc.nextLine().split(delim);
    // process tokens here
}